将此扩展方法添加到您的代码中:
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
属性执行它。
Asp.Net中存在一个错误(可以回避,请参见下文),该错误发生在使用端口80以外的端口访问本地网站的计算机上(如果内部网站是通过虚拟IP上的负载平衡发布的,这是一个大问题)和端口在内部用于发布规则),即使原始请求未使用该端口,Asp.Net也会始终在该AbsoluteUri
属性上添加端口。
此代码确保在发生任何负载平衡等之前,返回的url始终等于浏览器最初请求的URL (包括端口-因为它将包含在主机头中)。
至少,它在我们(而不是令人费解的!)环境中起作用:)
如果在重写主机头之间存在任何时髦的代理,那么这也不起作用。
2013年7月30日更新
正如@KevinJones在下面的评论中提到的那样-我在下一节中提到的设置已记录在这里:http : //msdn.microsoft.com/zh-cn/library/hh975440.aspx
尽管我不得不说尝试时无法使它工作-但这可能只是我在打错字或其他内容。
2012年7月9日更新
不久前,我碰到了这个问题,打算更新此答案,但从未成功。当刚刚对这个答案发表意见时,我认为我现在应该这样做。
我在Asp.Net中提到的“错误”可以通过一个明显未记录的appSettings值控制-称为'aspnet:UseHostHeaderForRequest'
-即:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
我HttpRequest.Url
在ILSpy中查看时碰到了这一点- --->
该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) { /* build from server name and port */
...
我个人没有使用过它-它没有证件,因此不能保证能坚持使用-但是它可能会执行我上面提到的相同操作。为了提高搜索结果的相关性-并承认其他人似乎已经发现了这一点-Nick Aceves在Twitter上也提到了该'aspnet:UseHostHeaderForRequest'
设置