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.

Chuck Le Butt
la source

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).

Darin Dimitrov
la source
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é.

Dismissile
la source
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.

NightOwl888
la source
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();
À M
la source
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"];
Saad Hasan
la source
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();
Serj Sagan
la source
2
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();
Donat Sasin
la source
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é)

Sportac
la source
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
}
mrbengi
la source