Request.Url.Host e ApplicationPath in una sola chiamata
-
22-08-2019 - |
Domanda
C'è un modo per ottenere HttpContext.Current.Request.Url.Host
e HttpContext.Current.Request.ApplicationPath
in una chiamata?
Qualcosa come "URL completo applicazione"?
EDIT: Precisazione - che cosa ho bisogno è questa la parte entro []:
http://[www.mysite.com/mywebapp]/Pages/Default.aspx
Chiedo semplicemente per curiosità.
EDIT 2: Grazie per tutte le risposte, ma nessuno di loro era esattamente quello che stavo cercando. Cordiali saluti, ho risolto il problema in questo modo (ma sono ancora interessato a sapere se c'è un modo più agevole):
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;
}
Soluzione
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;
}
Altri suggerimenti
Questo non funzionava sul mio localhost con un numero di porta in modo reso piccola modifica:
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;
}
Che cosa si dovrebbe davvero fare è:
return String.Format("{0}://{1}/", Request.Url.Scheme, Request.Url.Host);
In questo modo funziona se si utilizza HTTPS (o qualche altro schema!)
Grazie per tutte le risposte, ma nessuno di loro era esattamente quello che stavo cercando. Cordiali saluti, ho risolto il problema in questo modo (ma sono ancora interessato a sapere se c'è un modo più agevole):
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;
}
Se non si ottiene quello che ti serve da getBaseURL direcly, è dovrebbe essere possibile fare:
GetAbsoluteUrl(HttpContext.Current.Request, "/")
HttpContext.Current.Request.Url.AbsoluteUri