Request.Url.Host et ApplicationPath en un seul appel
-
22-08-2019 - |
Question
Est-il possible d'obtenir HttpContext.Current.Request.Url.Host
et HttpContext.Current.Request.ApplicationPath
dans un appel?
Quelque chose comme "url pleine application"?
EDIT: clarification - ce que je dois c'est la partie dans les []:
http://[www.mysite.com/mywebapp]/Pages/Default.aspx
Je demande simplement par curiosité.
EDIT 2: Merci pour toutes les réponses, mais aucun d'entre eux étaient exactement ce que je cherchais. Pour votre information, j'ai résolu le problème de cette façon (mais je suis toujours intéressé à savoir s'il y a un moyen plus lisse):
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;
}
La solution
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;
}
Autres conseils
Ce ne fonctionnait pas sur mon localhost avec un numéro de port si fait des modifications mineures:
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;
}
Ce que vous devez vraiment faire est:
return String.Format("{0}://{1}/", Request.Url.Scheme, Request.Url.Host);
De cette façon, cela fonctionne si vous utilisez HTTPS (ou un autre schéma!)
Merci pour toutes les réponses, mais aucun d'entre eux étaient exactement ce que je cherchais. Pour votre information, j'ai résolu le problème de cette façon (mais je suis toujours intéressé à savoir s'il y a un moyen plus lisse):
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;
}
Vérifier ce message :
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 vous ne recevez pas ce que vous avez besoin de GetBaseUrl direcly, est devrait être possible de le faire:
GetAbsoluteUrl(HttpContext.Current.Request, "/")
HttpContext.Current.Request.Url.AbsoluteUri