125 votes

Obtenir le HTTP Referrer en ASP.NET

Je recherche un moyen rapide, facile et fiable d'obtenir le référent HTTP du navigateur en ASP.Net (C#). Je sais que le référent HTTP lui-même est peu fiable, mais je veux tout de même une façon fiable d'obtenir le référent s'il est présent.

2 votes

0 votes

185voto

Darin Dimitrov Points 528142

Vous pouvez utiliser la propriété UrlReferrer de la requête actuelle :

Request.UrlReferrer

Cela lira l'en-tête HTTP Referer de la requête qui peut être fourni ou non par le client (agent utilisateur).

10 votes

Il convient de noter que cette propriété lèvera une System.UriFormatException si l'en-tête HTTP referer est mal formé.

1 votes

@Darin Dimitrov J'essaie de créer une API REST en utilisant WEB API. UrlReferrer ne fait pas partie de l'objet Request. Devrais-je ajouter quelques "using", etc. Que suis-je en train de rater? Un DLL?

2 votes

Il convient de noter que la différence d'orthographe est correcte. L'en-tête http est mal orthographié. MS utilise la bonne orthographe dans le nom de la propriété. Malheureusement, les deux ne correspondent pas, ce qui peut causer de la confusion chez certaines personnes (comme moi) lors des tests.

36voto

NightOwl888 Points 4622
Request.Headers["Referer"]

Explication

La propriété Request.UrlReferrer lancera une System.UriFormatException si l'en-tête referer HTTP est mal formée (ce qui peut arriver car elle n'est généralement pas sous votre contrôle).

Par conséquent, la propriété Request.UrlReferrer n'est pas fiable à 100% - elle peut contenir des données qui ne peuvent pas être analysées en tant que classe Uri. Pour garantir que la valeur est toujours lisible, utilisez plutôt Request.Headers["Referer"].

Concernant l'utilisation de Request.ServerVariables comme d'autres l'ont suggéré ici, selon MSDN :

Collection Request.ServerVariables

La collection ServerVariables récupère les valeurs des variables d'environnement prédéfinies et des informations d'en-tête de requête.

Propriété Request.Headers

Obtient une collection d'en-têtes HTTP.

Request.Headers est un meilleur choix que Request.ServerVariables, car Request.ServerVariables contient toutes les variables d'environnement ainsi que les en-têtes, tandis que Request.Headers est une liste beaucoup plus courte ne contenant que les en-têtes.

La solution la plus fiable est donc d'utiliser la collection Request.Headers pour lire directement la valeur. Veuillez toutefois tenir compte des avertissements de Microsoft concernant l'encodage HTML de la valeur si vous devez l'afficher sur un formulaire.

3 votes

Notez que l'en-tête Referer est orthographié différemment que la variable de serveur HTTP_REFERRER.

22voto

Dismissile Points 12054

Utilisez la propriété Request.UrlReferrer.

Sous les coulisses, il vérifie simplement la propriété ServerVariables("HTTP_REFERER").

2 votes

Donc il n'y aurait aucune différence si j'utilisais : HttpContext.Current.Request.ServerVariables["HTTP_REFERER"] ?

2 votes

En théorie, il n'y a pas de différence, en pratique je ne peux pas dire avec certitude car un rapide coup d'œil avec le réflecteur montre que UrlReferrer fait beaucoup plus qu'un simple appel à ServerVariables("HTTP_REFERER")

13 votes

Je peux vous dire que ServerVariables["HTTP_REFERER"] renvoie une chaîne de caractères, tandis que Request.UrlReferrer renvoie une Uri.

14voto

Tom Points 2410

Comme ceci : Propriété HttpRequest.UrlReferrer

Uri myReferrer = Request.UrlReferrer;
string actual = myReferrer.ToString();

2 votes

Pour se protéger contre le nul, vous pouvez dire : string actual = "" + Request.UrlReferrer ?? "(défaut)"; // (défaut) peut être une chaîne vide

1voto

Mohsen Afshin Points 3643

Tout comme dans un autre fil SO, le problème est que UrlReferrer ne fonctionne pas avec les redirections, il fonctionne uniquement avec les hyperliens. Dans les redirections, il est nul.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X