Request.Url.Host 和 ApplicationPath 一次调用
Posted
技术标签:
【中文标题】Request.Url.Host 和 ApplicationPath 一次调用【英文标题】:Request.Url.Host and ApplicationPath in one call 【发布时间】:2010-10-15 22:29:26 【问题描述】:有什么方法可以在一个电话中获得HttpContext.Current.Request.Url.Host
和HttpContext.Current.Request.ApplicationPath
?
类似于“完整的应用程序网址”?
编辑:澄清-我需要的是[]中的部分:
http://[www.mysite.com/mywebapp]/Pages/Default.aspx
我只是出于好奇而问。
编辑 2:感谢所有回复,但没有一个是我想要的。 仅供参考,我以这种方式解决了问题(但我仍然想知道是否有更顺畅的方式):
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;
【问题讨论】:
理论上你想要Request.Url.Authority;主机没有端口。不幸的是,最好的办法是使用 Request.Headers["HOST"] 中的内容,因为它应该包含客户端用来连接的服务器的 dns:port。如果您担心 HTTP/1.0 请求,当然可以回退到 Request.Url.Host。我亲身体验过 Request.Url.Authority 返回服务器软件绑定的端口,而不是“HOST”标头中的端口——这是客户端用来连接的。 (FWIW,它位于 s-s-rS 2012 的报告管理器网站中。) 【参考方案1】: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;
【讨论】:
IIRC SERVER_NAME 可能无法为您提供所需的主机名 - 例如主机头解析(msdn.microsoft.com/en-us/library/ms524602.aspx)!如果我错了,请纠正我:) 我已经在不同的网站上使用了这个多年 - 它为您提供了请求的服务器名称,从 http:// 到第一个 / 如果可行,非常感谢。正在寻找可以与非标准端口和blah.com/web/test/hello.aspx 等网址一起使用的东西。我会试一试。 我从自己的帖子中删除了答案标签,并将其移至此,因为此答案涵盖了更多情况。【参考方案2】:这在我的带有端口号的本地主机上不起作用,因此进行了小修改:
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;
【讨论】:
【参考方案3】:你真正应该做的是:
return String.Format("0://1/", Request.Url.Scheme, Request.Url.Host);
如果您使用的是 HTTPS(或其他一些架构!),那么它可以工作。
【讨论】:
【参考方案4】:感谢所有回复,但没有一个是我想要的。 仅供参考,我以这种方式解决了问题(但我仍然想知道是否有更顺畅的方式):
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;
【讨论】:
是的,我的解决方案并没有真正处理这个问题,但这会:返回 String.Format("0://1/", Request.Url.Scheme, Request.Url .Host);【参考方案5】:查看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;
如果你没有直接从 GetBaseUrl 得到你需要的东西,应该可以这样做:
GetAbsoluteUrl(HttpContext.Current.Request, "/")
【讨论】:
【参考方案6】:HttpContext.Current.Request.Url.AbsoluteUri
【讨论】:
谢谢,但没有 - 这为您提供了调用它的 ASPX 页面的完整路径。我只想要主机 + 应用程序路径,而不是页面路径。以上是关于Request.Url.Host 和 ApplicationPath 一次调用的主要内容,如果未能解决你的问题,请参考以下文章