Добавьте этот метод расширения в ваш код:
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-адресу, который первоначально запрашивал браузер (включая порт - как он будет включен в заголовок хоста), прежде чем произойдет какое-либо распределение нагрузки и т. Д.
По крайней мере, в нашей (довольно запутанной!) Среде :)
Если между ними есть какие-нибудь фанки прокси, которые переписывают заголовок хоста, то это тоже не сработает.
Обновление 30 июля 2013
Как упомянуто @KevinJones в комментариях ниже - настройка, о которой я упоминаю в следующем разделе, была задокументирована здесь: http://msdn.microsoft.com/en-us/library/hh975440.aspx
Хотя я должен сказать, что не смог заставить его работать, когда попробовал - но это может быть просто я сделал опечатку или что-то в этом роде.
Обновление 9 июля 2012
Я столкнулся с этим некоторое время назад, и хотел обновить этот ответ, но никогда не делал. Когда на этот ответ пришло возражение, я подумал, что должен сделать это сейчас.
«Ошибка», которую я упоминаю в 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 */
...
Лично я не использовал его - он не имеет документов и поэтому не гарантированно останется здесь, однако он может сделать то же самое, что я упомянул выше. Для повышения релевантности в результатах поиска - и признать , кто - то другой seeems, что обнаружил это - установка также упоминается Ник Aceves на Twitter'aspnet:UseHostHeaderForRequest'