Fügen Sie diese Erweiterungsmethode Ihrem Code hinzu:
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
Eigenschaft ausführen .
In Asp.Net gibt es einen Fehler (kann umgangen werden, siehe unten), der auf Computern auftritt, die andere Ports als Port 80 für die lokale Website verwenden (ein großes Problem, wenn interne Websites über Load Balancing auf virtueller IP veröffentlicht werden und Ports werden intern für Veröffentlichungsregeln verwendet), wobei Asp.Net den Port immer zur AbsoluteUri
Eigenschaft hinzufügt - auch wenn die ursprüngliche Anforderung ihn nicht verwendet.
Dieser Code stellt sicher, dass die zurückgegebene URL immer der URL entspricht, die der Browser ursprünglich angefordert hat (einschließlich des Ports - wie er im Host-Header enthalten wäre), bevor ein Lastenausgleich usw. stattfindet.
Zumindest in unserer (ziemlich verworrenen!) Umgebung :)
Wenn sich dazwischen funky Proxys befinden, die den Host-Header neu schreiben, funktioniert dies auch nicht.
Update 30. Juli 2013
Wie von @KevinJones in den Kommentaren unten erwähnt, wurde die Einstellung, die ich im nächsten Abschnitt erwähne, hier dokumentiert: http://msdn.microsoft.com/en-us/library/hh975440.aspx
Ich muss zwar sagen, dass ich es nicht zum Laufen bringen konnte, als ich es ausprobiert habe - aber das könnte nur sein, dass ich einen Tippfehler mache oder so.
Update 9. Juli 2012
Ich bin vor einiger Zeit darauf gestoßen und wollte diese Antwort aktualisieren, habe es aber nie getan. Als gerade eine Gegenstimme zu dieser Antwort einging, dachte ich, ich sollte es jetzt tun.
Der 'Fehler', den ich in Asp.Net erwähne, kann mit einem scheinbar undokumentierten appSettings-Wert gesteuert werden - genannt 'aspnet:UseHostHeaderForRequest'
- dh:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
Ich bin beim Betrachten HttpRequest.Url
in ILSpy darauf gestoßen - angezeigt durch --->
das links von der folgenden Kopie / Einfügen 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 benutzt - es ist nicht dokumentiert und daher nicht garantiert, dass es dabei bleibt - aber es könnte dasselbe tun, was ich oben erwähnt habe. Um die Relevanz in den Suchergebnissen zu erhöhen und jemanden anzuerkennen, der dies entdeckt zu haben scheint, wurde die 'aspnet:UseHostHeaderForRequest'
Einstellung auch von Nick Aceves auf Twitter erwähnt