Fügen Sie diese Erweiterungsmethode in Ihren Code ein:
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));
}
Und dann können Sie es von der RequestContext.HttpContext.Request
Eigentum.
Es gibt einen Fehler (der umgangen werden kann, siehe unten) in Asp.Net, der auf Rechnern auftritt, die andere Ports als Port 80 für die lokale Website verwenden (ein großes Problem, wenn interne Websites über Load-Balancing auf virtuellen IPs veröffentlicht werden und Ports intern für Veröffentlichungsregeln verwendet werden), wodurch Asp.Net immer fügen Sie den Anschluss auf der AbsoluteUri
Eigenschaft - auch wenn die ursprüngliche Anfrage sie nicht verwendet.
Dieser Code stellt sicher, dass die zurückgegebene Url immer mit der Url des Browsers übereinstimmt. ursprünglich angefordert werden (einschließlich des Ports - da dieser im Host-Header enthalten ist), bevor ein Lastausgleich usw. stattfindet.
Zumindest in unserem (ziemlich verworrenen!) Umfeld :)
Wenn dazwischen irgendwelche Proxys sind, die den Host-Header umschreiben, funktioniert das auch nicht.
Update 30. Juli 2013
Wie von @KevinJones in den Kommentaren unten erwähnt - die Einstellung, die ich im nächsten Abschnitt erwähne, wurde hier dokumentiert: http://msdn.microsoft.com/en-us/library/hh975440.aspx
Obwohl ich sagen muss, dass ich es nicht hinbekommen habe, als ich es ausprobiert habe - aber das könnte auch nur an einem Tippfehler oder so liegen.
Aktualisierung 9. Juli 2012
Ich bin vor einiger Zeit auf diese Frage gestoßen und wollte diese Antwort aktualisieren, habe es aber nicht getan. Als gerade ein Upvote auf diese Antwort hereinkam, dachte ich, ich sollte es jetzt tun.
Der 'Bug', den ich in Asp.Net erwähne, kann mit einem offenbar undokumentierten appSettings-Wert kontrolliert werden - genannt 'aspnet:UseHostHeaderForRequest'
- d.h:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
Ich bin auf diese Seite gestoßen, als ich mir HttpRequest.Url
in ILSpy - angezeigt durch das Symbol --->
auf der linken Seite des folgenden Kopier-/Einfügevorgangs aus dieser ILSpy-Ansicht:
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 */
...
Ich persönlich habe es nicht verwendet - es ist undokumentiert und daher nicht garantiert, dass es bestehen bleibt - aber es könnte dasselbe bewirken, was ich oben erwähnt habe. Um die Relevanz in den Suchergebnissen zu erhöhen - und um jemandem zu danken, der dies entdeckt zu haben scheint - die 'aspnet:UseHostHeaderForRequest'
Einstellung wurde auch von Nick Aceves auf Twitter erwähnt