Request.Url.Host y ApplicationPath en una llamada
-
22-08-2019 - |
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;
}
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;
}
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