2009-03-27 9 views
15

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

¿Alguien como "full application url"?

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

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

te pido simplemente por curiosidad.

EDIT 2: Gracias por todas las respuestas, pero ninguna de ellas era exactamente lo que estaba buscando. FYI, 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; 
} 
+0

Quiere Request.Url.Authority, en teoría; Host no tiene el puerto. Desafortunadamente, su mejor opción es usar lo que está en Request.Headers ["HOST"], ya que se supone que contiene el dns: puerto del servidor que el cliente utilizó para conectarse. Si le preocupan las solicitudes HTTP/1.0, puede recurrir a Request.Url.Host, por supuesto. He experimentado personalmente Request.Url.Authority para devolver el puerto al que está vinculado el software del servidor, no el puerto en el encabezado "HOST" --- que es lo que el cliente utilizó para conectarse. (FWIW, estaba en el sitio web del Administrador de informes de SSRS 2012). – Granger

Respuesta

29
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; 
} 
+0

IIRC SERVER_NAME podría no obtener el nombre de host que necesita, p. Ej. resolución de encabezado de host (http://msdn.microsoft.com/en-us/library/ms524602.aspx)! Corrígeme si estoy equivocado :) – veggerby

+2

He usado este durante años, en diferentes sitios, y le da el nombre del servidor de la solicitud realizada, que es todo de http: // al primero/ – MartinHN

+0

Si esto funciona, muchas gracias. Estaba buscando algo que funcionara con puertos no estándar y con direcciones URL como https://www.blah.com/web/test/hello.aspx. Voy a darle un giro. – infocyde

2

Comprobar this 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 usted no recibe lo que necesita de GetBaseUrl direcly, es debería ser posible hacer:

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

1
HttpContext.Current.Request.Url.AbsoluteUri 
+0

Gracias, pero no, eso le da la ruta completa de la página ASPX desde la que se llama. Solo quiero la ruta de la aplicación host +, no la ruta de la página. –

3

Gracias por todas las respuestas, pero ninguna de ellas era exactamente lo que estaba buscando. FYI, 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; 
} 
+0

¿y si es https? –

+0

Sí, mi solución realmente no maneja eso, pero esto sería: return String.Format ("{0}: // {1} /", Request.Url.Scheme, Request.Url.Host); –

5

Lo que realmente debe hacer es:

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

De esta manera funciona si están usando HTTPS

16

Esto no estaba trabajando en mi localhost con un número de puerto por lo que hizo una pequeña modificación (o algún otro esquema!):

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; 
    } 
Cuestiones relacionadas