Obtenir le référent HTTP dans ASP.NET


103

Je recherche un moyen rapide, simple et fiable d'obtenir le référent HTTP du navigateur dans ASP.Net ( C # ). Je sais que le référent HTTP lui-même n'est pas fiable, mais je veux un moyen fiable d'obtenir le référent s'il est présent.



Réponses:


166

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

Request.UrlReferrer

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


8
Il convient de noter que cette propriété lèvera une exception System.UriFormatException si l'en-tête HTTP référent est mal formé.
NightOwl888

1
@Darin Dimitrov J'essaye de créer une API REST en utilisant l'API WEB. UrlReferrer ne fait pas partie de l'objet Request. Dois-je ajouter des "using", etc. une DLL?
Ravi

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

8
Soyez prudent si vous utilisez Request.UrlReferreraprès une publication côté serveur. Bien sûr, Request.UrlReferreraura maintenant la valeur de la page sur laquelle vous postez. Dans la plupart des cas, les utilisateurs ont besoin de la page précédente. Dans ce cas, assurez-vous de stocker la page précédente dans, par exemple, une variable viewstate lorsque la page se charge pour la première fois. Et puis, lorsque vous accédez à cette variable, elle a la page précédente d'où vous venez. Par exemple, dans l'événement de chargement de page des formulaires asp.net, vous pouvez faire:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
JonH

4
... et lorsque vous postez de nouveau par exemple, vous pouvez faire:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
JonH

20

Utilisez la Request.UrlReferrerpropriété.

Sous les scènes, il ne fait que vérifier la ServerVariables("HTTP_REFERER")propriété.


2
Il n'y aurait donc pas de différence si j'utilisais: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Chuck Le Butt

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

13
Je peux vous dire que ServerVariables["HTTP_REFERER"]renvoie une chaîne , alors que Request.UrlReferrerrenvoie un Uri .
Chuck Le Butt

19
Request.Headers["Referer"]

Explication

La Request.UrlRefererpropriété lancera un System.UriFormatExceptionsi l'en-tête HTTP du référent est mal formé (ce qui peut arriver car il n'est généralement pas sous votre contrôle).

Quant à l'utilisation Request.ServerVariables, par MSDN:

Request.ServerVariables, collection

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

Request.Headers, propriété

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

Request.Headersest un meilleur choix que Request.ServerVariables, puisque Request.ServerVariablescontient toutes les variables d'environnement ainsi que les en-têtes, où Request.Headersest une liste beaucoup plus courte qui ne contient que les en-têtes.

La meilleure solution est donc d'utiliser la Request.Headerscollection pour lire directement la valeur. Tenez cependant compte des avertissements de Microsoft concernant l'encodage HTML de la valeur si vous prévoyez de l'afficher sur un formulaire, cependant.


2
Notez que l'en- Referertête est orthographié différemment de la HTTP_REFERRERvariable serveur.
Rudey

13

Comme ceci: Propriété HttpRequest.UrlReferrer

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

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

10

J'utilise .Net Core 2 mvc, celui-ci fonctionne pour moi (pour obtenir la page des aperçus):

HttpContext.Request.Headers["Referer"];

9

Puisque Google vous amène à cet article lors de la recherche, C# Web API Referrervoici l'offre: Web APIutilise un type différent Requestde l' MVC Requestappel normal HttpRequestMessagequi n'inclut pas UrlReferrer. Puisqu'une Web APIdemande normale n'inclut pas ces informations, si vous en avez vraiment besoin, vous devez obliger vos clients à faire tout leur possible pour les inclure. Bien que vous puissiez en faire partie API Object, une meilleure façon est de l'utiliser Headers.

Tout d'abord, vous pouvez étendre HttpRequestMessagepour fournir une UrlReferrer()méthode:

public static string UrlReferrer(this HttpRequestMessage request)
{
    return request.Headers.Referrer == null ? "unknown" : request.Headers.Referrer.AbsoluteUri;
}

Ensuite, vos clients doivent définir le Referrer Headersur leur API Request:

// Microsoft.AspNet.WebApi.Client
client.DefaultRequestHeaders.Referrer = new Uri(url);

Et maintenant, le Web API Requestcomprend les données de référence auxquelles vous pouvez accéder comme ceci à partir de votre Web API:

Request.UrlReferrer();

2
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();

1
C'est pour ApiController. C'est ce dont j'avais besoin.
Csaba Toth

2

Parfois, vous devez donner tout le lien comme celui-ci

System.Web.HttpContext.Current.Request.UrlReferrer.ToString();

(en option lorsque "Actuel" n'est pas fondé)


0

Appartenant à une autre réponse, j'ai ajouté une clause de condition pour obtenir la nullité.

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.