viernes, 11 de mayo de 2012

ResolveUrl en un servicio web de ASP.NET

Si programas en Web Forms estarás muy acostumbrado a utilizar los métodos ResolveUrl y ResolveClientUrl para devolver direcciones Url al código de cliente a partir de direcciones de ASP.NET (es decir, aquellas direcciones que son relativas a la raíz del proyecto y que comienzan con el carácter ~)

Los métodos ResolveUrl y ResolveClientUrl son métodos de la clase System.Web.UI.Control y es por ello que están disponibles tanto en un WebForm (.aspx) como en un control de usuario (.ascx).

Sin embargo, si estamos ejecutando código en un servicio web de ASP.NET (.asmx) no tenemos disponible estas funciones (porque un servicio web hereda de System.Web.Services.WebService) y lógicamente puede ser que queremos devolver al cliente direcciones url válidas a partir de direcciones del tipo ASP.NET (recuerda que son aquellas que incluyen el carácter ~).

En esta situación, nos será muy útil una función como la siguiente que “simula” el comportamiento de ResolveUrl y ResolveClientUrl. Digo “simula” porque con esta función estamos devolviendo rutas absolutas en vez de relativas, pero en cualquier caso estamos devolviendo rutas que el cliente puede consumir.

Imports System.Web
Public Class Utilities
    Public Shared Function ResolveUrl(ByVal url As String) As String
        Dim webApplicationRootUrl = _
            String.Format("{0}://{1}{2}", _
                HttpContext.Current.Request.Url.Scheme, _
                HttpContext.Current.Request.ServerVariables.Item("HTTP_HOST"), _
                HttpContext.Current.Request.ApplicationPath)
        If Not webApplicationRootUrl.EndsWith("/") Then
            webApplicationRootUrl &= "/"
        End If
        url = url.Substring(2) ' Quitar ~/
        url = webApplicationRootUrl & url
        Return url
    End Function
End Class

Ahora por ejemplo para una llamada a ResolveUrl("~/Default.aspx"), el método nos devolverá una dirección absoluta como http://localhost:7572/WebSite1/Default.aspx donde:


  • http es el esquema.
  • localhost:7572 es la variable HTTP_HOST
  • WebSite1 es la ruta a la aplicación.
  • Default.aspx es la url suministrada al método.

Un saludo!

4 comentarios:

  1. y podemos anexar eso con un Response.Redirect ?

    ResponderEliminar
  2. Yo creo que sí, sin problemas. Al final Response.Redirect quiere una ruta, si es de servidor, con ~, la convertirá, sino simplemente hará un redirect a la url que nosotros le pasemos.
    Gracias por comentar!

    ResponderEliminar