Ajoutez cette méthode d'extension à votre code :
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));
}
Et ensuite vous pouvez l'exécuter à partir du RequestContext.HttpContext.Request
propriété.
Il existe un bogue (qui peut être contourné, voir ci-dessous) dans Asp.Net qui se produit sur les machines qui utilisent des ports autres que le port 80 pour le site web local (un problème important si les sites web internes sont publiés via l'équilibrage de charge sur l'IP virtuelle et que les ports sont utilisés en interne pour les règles de publication). toujours ajouter le port sur le AbsoluteUri
même si la demande originale ne l'utilise pas.
Ce code garantit que l'url retournée est toujours égale à l'url du navigateur. à l'origine demandé (y compris le port - comme il serait inclus dans l'en-tête de l'hôte) avant tout équilibrage de charge, etc.
Du moins, c'est le cas dans notre environnement (plutôt alambiqué !) :)
S'il existe entre les deux des proxies qui réécrivent l'en-tête de l'hôte, cela ne fonctionnera pas non plus.
Mise à jour du 30 juillet 2013
Comme mentionné par @KevinJones dans les commentaires ci-dessous - le paramètre que je mentionne dans la section suivante a été documenté ici : http://msdn.microsoft.com/en-us/library/hh975440.aspx
Bien que je doive dire que je n'ai pas réussi à le faire fonctionner quand je l'ai essayé - mais cela pourrait juste être une faute de frappe ou autre.
Mise à jour du 9 juillet 2012
Je suis tombé sur ce sujet il y a quelque temps, et j'avais l'intention de mettre à jour cette réponse, mais je ne l'ai jamais fait. Quand un vote positif est arrivé sur cette réponse, j'ai pensé que je devais le faire maintenant.
Le "bug" que je mentionne dans Asp.Net peut être contrôlé avec une valeur appSettings apparemment non documentée - appelée 'aspnet:UseHostHeaderForRequest'
- c'est-à-dire
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
Je suis tombé sur ceci en regardant HttpRequest.Url
dans ILSpy - indiqué par l'icône --->
à gauche du copier/coller suivant de cette vue 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 */
...
Je ne l'ai personnellement pas utilisé - il n'est pas documenté et n'est donc pas garanti de rester en place - mais il pourrait faire la même chose que ce que je mentionne ci-dessus. Pour augmenter la pertinence dans les résultats de recherche - et pour remercier quelqu'un d'autre qui semble l'avoir découvert - je vous invite à consulter la page suivante. el 'aspnet:UseHostHeaderForRequest'
setting a également été mentionné par Nick Aceves sur Twitter