将此扩展方法添加到您的代码中:
public static Uri UrlOriginal(this HttpRequestBase request)
{
string hostHeader = request.Headers["host"];
return new Uri(string.Format("{0}://{1}{2}",
request.Url.Scheme,
hostHeader,
request.RawUrl));
}
然后,您可以通过RequestContext.HttpContext.Request
属性执行它。
在使用本地网站的端口(如果内部网站通过虚拟IP负载平衡发布,并且端口用于发布规则,则是一个重大问题)不是80端口的计算机上会出现Asp.Net的错误(可以通过以下方法避免)- 即使原始请求没有使用端口,Asp.Net也始终会在AbsoluteUri
属性上添加端口。
此代码确保返回的URL始终等于浏览器最初请求的URL(包括端口 - 因为它将包含在主机标头中)在任何负载平衡等操作之前。
至少,在我们(相当复杂的!)环境中是这样的 :)
如果有任何奇怪的代理在其中重写主机标头,那么这也将无法正常工作。
更新 2013年7月30日
如下面的评论中@KevinJones提到的 - 我在下一节中提到的设置已在此处记录:http://msdn.microsoft.com/en-us/library/hh975440.aspx
虽然我必须说,当我尝试时,我无法让它起作用 - 但那可能只是我打错了一个字母。
更新 2012年7月9日
我有一段时间以前就遇到了这个问题,本来想更新这个答案,但从未这样做。当这个答案收到投票时,我想现在应该更新一下。
我在Asp.Net中提到的“错误”可以使用一个显然未记录的appSettings值来控制 - 称为'aspnet: UseHostHeaderForRequest'
:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
我在查看ILSpy中的HttpRequest.Url
时发现了这个 - 在以下从ILSpy视图复制/粘贴的左边用--->
表示:
public Uri Url
{
get
{
if (this._url == null && this._wr != null)
{
string text = this.QueryStringText;
if (!string.IsNullOrEmpty(text))
{
text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text,
this.QueryStringEncoding);
}
---> if (AppSettings.UseHostHeaderForRequestUrl)
{
string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
try
{
if (!string.IsNullOrEmpty(knownRequestHeader))
{
this._url = new Uri(string.Concat(new string[]
{
this._wr.GetProtocol(),
"://",
knownRequestHeader,
this.Path,
text
}));
}
}
catch (UriFormatException)
{ }
}
if (this._url == null) {
...
我个人还没有使用过它 - 由于它是未记录的,因此不能保证会一直存在 - 不过它可能会做我上面提到的同样的事情。为了增加搜索结果的相关性 - 并承认其他人发现了这一点 - 在 Twitter 上 Nick Aceves 也提到了'aspnet:UseHostHeaderForRequest'
设置
Request.Url.ToString()
或Request.Url.AbsoluteUri
怎么样? - Darin DimitrovRequest.Url.AbsoluteUri
就可以了 :) - Chev