Додайте цей метод розширення у свій код:
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'