Pregunta

¿Hay alguna manera de obtener HttpContext.Current.Request.Url.Host y HttpContext.Current.Request.ApplicationPath en una llamada?

Algo así como "URL de la aplicación plena"?

EDIT: Aclaración - lo que necesito es esta la parte dentro de []:

http://[www.mysite.com/mywebapp]/Pages/Default.aspx

Me pregunto simplemente por curiosidad.

EDIT 2: Gracias por todas las respuestas, pero ninguno de ellos era exactamente lo que estaba buscando. Para su información, he resuelto el problema de esta manera (pero todavía estoy interesado en saber si hay una manera más suave):

public string GetWebAppRoot()
{
    if(HttpContext.Current.Request.ApplicationPath == "/")
        return "http://" + HttpContext.Current.Request.Url.Host;
    else
        return "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath;
}
¿Fue útil?

Solución

public static string GetSiteRoot()
{
  string port = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"];
  if (port == null || port == "80" || port == "443")
    port = "";
  else
    port = ":" + port;

  string protocol = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT_SECURE"];
  if (protocol == null || protocol == "0")
    protocol = "http://";
  else
    protocol = "https://";

  string sOut = protocol + System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"] + port + System.Web.HttpContext.Current.Request.ApplicationPath;

  if (sOut.EndsWith("/"))
  {
    sOut = sOut.Substring(0, sOut.Length - 1);
  }

  return sOut;
}

Otros consejos

Esto no estaba trabajando en mi localhost con un número de puerto por lo que hizo una pequeña modificación:

  private string GetWebAppRoot()
    {
        string host = (HttpContext.Current.Request.Url.IsDefaultPort) ? 
            HttpContext.Current.Request.Url.Host : 
            HttpContext.Current.Request.Url.Authority;
        host = String.Format("{0}://{1}", HttpContext.Current.Request.Url.Scheme, host);            
        if (HttpContext.Current.Request.ApplicationPath == "/")
            return host;
        else
            return host + HttpContext.Current.Request.ApplicationPath;
    }

Lo que realmente debe hacer es:

return String.Format("{0}://{1}/", Request.Url.Scheme, Request.Url.Host);

De esta manera funciona si está utilizando HTTPS (o algún otro esquema!)

Gracias por todas las respuestas, pero ninguno de ellos era exactamente lo que estaba buscando. Para su información, he resuelto el problema de esta manera (pero todavía estoy interesado en saber si hay una manera más suave):

public string GetWebAppRoot()
{
    if(HttpContext.Current.Request.ApplicationPath == "/")
        return "http://" + HttpContext.Current.Request.Url.Host;
    else
        return "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath;
}

este post :

public static Uri GetBaseUrl(HttpRequest request)
{
    Uri contextUri = new Uri(request.Url, request.RawUrl);
    UriBuilder realmUri = new UriBuilder(contextUri) { Path = request.ApplicationPath, Query = null, Fragment = null };
    return realmUri.Uri;
}

public static string GetAbsoluteUrl(HttpRequest request, string relativeUrl)
{
    return new Uri(GetBaseUrl(request), VirtualPathUtility.ToAbsolute(relativeUrl)).AbsoluteUri;
}

Si no obtiene lo que necesita de GetBaseUrl direcly, es debería ser posible hacerlo:

GetAbsoluteUrl(HttpContext.Current.Request, "/")

HttpContext.Current.Request.Url.AbsoluteUri
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top