Dodaj tę metodę rozszerzenia do swojego kodu:
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));
}
A następnie możesz wykonać to poza RequestContext.HttpContext.Request
właściwością.
W Asp.Net występuje błąd (można go usunąć krokiem, patrz poniżej), który pojawia się na komputerach, które używają portów innych niż port 80 dla lokalnej strony internetowej (duży problem, jeśli wewnętrzne strony internetowe są publikowane poprzez równoważenie obciążenia na wirtualnym IP a porty są używane wewnętrznie do reguł publikowania), dzięki czemu Asp.Net zawsze doda port do AbsoluteUri
właściwości - nawet jeśli pierwotne żądanie go nie używa.
Ten kod zapewnia, że zwrócony adres URL jest zawsze równy adresowi URL, którego pierwotnie zażądała przeglądarka (w tym port - tak jak byłby zawarty w nagłówku hosta), zanim nastąpi równoważenie obciążenia itp.
Przynajmniej działa w naszym (raczej skomplikowanym!) Środowisku :)
Jeśli między funkcjami przepisują nagłówek hosta jakieś funky proxy, to też nie zadziała.
Zaktualizuj 30 lipca 2013 r
Jak wspomniano w @KevinJones w komentarzach poniżej - ustawienie, o którym wspomniałem w następnej sekcji, zostało udokumentowane tutaj: http://msdn.microsoft.com/en-us/library/hh975440.aspx
Chociaż muszę powiedzieć, że nie mogłem go uruchomić, gdy go wypróbowałem - ale to może być po prostu literówka lub coś takiego.
Zaktualizuj 9 lipca 2012 r
Spotkałem się z tym jakiś czas temu i zamierzałem zaktualizować tę odpowiedź, ale nigdy tego nie zrobiłem. Kiedy właśnie pojawiła się opinia na temat tej odpowiedzi, pomyślałem, że powinienem to zrobić teraz.
„Błąd”, o którym wspomniałem w Asp.Net, można kontrolować za pomocą pozornie nieudokumentowanej wartości appSettings - nazywanej 'aspnet:UseHostHeaderForRequest'
- tj .:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
Natknąłem się na to, patrząc na HttpRequest.Url
ILSpy - wskazane przez --->
po lewej stronie następującej kopii / wklej z tego widoku 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 */
...
Ja osobiście nie korzystałem z niego - jest to nieudokumentowane i dlatego nie ma gwarancji, że będę się trzymał - jednak może zrobić to samo, o czym wspomniałem powyżej. W celu zwiększenia trafności w wynikach wyszukiwania - i potwierdzić ktoś, kto seeems odkryli ten - ustawienie zostało również wymienione przez Nick Aceves na Twitterze'aspnet:UseHostHeaderForRequest'