Abrufen des HTTP-Referrers in ASP.NET


103

Ich suche nach einer schnellen, einfachen und zuverlässigen Möglichkeit, den HTTP-Referrer des Browsers in ASP.Net ( C # ) abzurufen . Ich weiß , dass die Referrer selbst unzuverlässig ist, aber ich will einen zuverlässigen Weg , um die Referrer zu bekommen , wenn es ist vorhanden.



Antworten:


166

Sie können die UrlReferrer- Eigenschaft der aktuellen Anforderung verwenden:

Request.UrlReferrer

Dadurch wird der Referer- HTTP-Header aus der Anforderung gelesen, die möglicherweise vom Client (Benutzeragent) bereitgestellt wird oder nicht.


8
Es ist zu beachten, dass diese Eigenschaft eine System.UriFormatException auslöst, wenn der HTTP-Header des Verweisers fehlerhaft ist.
NightOwl888

1
@Darin Dimitrov Ich versuche, eine REST-API mithilfe der WEB-API zu erstellen. UrlReferrer ist nicht Teil des Request-Objekts. Soll ich etwas "using" usw. hinzufügen? Was fehlt mir? eine DLL?
Ravi

1
Es sollte beachtet werden, dass der Unterschied darin besteht, dass die Schreibweise korrekt ist. Der http-Header ist falsch geschrieben. MS verwendet die richtige Schreibweise im Eigenschaftsnamen. Leider stimmen die beiden nicht überein, was bei einigen Leuten (mir) beim Testen Verwirrung stiften kann.
John

8
Seien Sie vorsichtig, wenn Sie Request.UrlReferrernach einem serverseitigen Postback verwenden. Natürlich Request.UrlReferrerhat jetzt der Wert der Seite, auf der Sie zurück posten. In den meisten Fällen benötigen die Benutzer die vorherige Seite. Stellen Sie in diesem Fall sicher, dass Sie die vorherige Seite beispielsweise beim ersten Laden der Seite in einer Ansichtsstatusvariablen speichern. Wenn Sie dann auf diese Variable zugreifen, wird die vorherige Seite angezeigt, von der Sie gekommen sind. Zum Beispiel können Sie in asp.net Forms Page Load Event if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
Folgendes

4
... und wenn Sie zum Beispiel zurück posten, könnten Sie tun:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
JonH

20

Verwenden Sie die Request.UrlReferrerEigenschaft.

Unter den Kulissen wird nur die ServerVariables("HTTP_REFERER")Eigenschaft überprüft .


2
Es würde also nichts anderes geben, wenn ich Folgendes verwenden würde: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Chuck Le Butt

2
Theoretisch gibt es keinen Unterschied, in der Praxis kann ich nicht sicher sagen, da ein kurzer Blick mit dem Reflektor zeigt, dass UrlReferrerdies viel mehr ist als ein einfacher Anruf beiServerVariables("HTTP_REFERER")
Diadistis

13
Ich kann Ihnen sagen, dass ServerVariables["HTTP_REFERER"]ein String zurückgegeben wird , während Request.UrlReferrerein Uri zurückgegeben wird .
Chuck Le Butt

19
Request.Headers["Referer"]

Erläuterung

Die Request.UrlRefererEigenschaft löst ein aus, System.UriFormatExceptionwenn der Referer-HTTP-Header fehlerhaft ist (was passieren kann, da er normalerweise nicht unter Ihrer Kontrolle steht).

Wie für die Verwendung Request.ServerVariables, pro MSDN:

Request.ServerVariables-Sammlung

Die ServerVariables-Auflistung ruft die Werte vorgegebener Umgebungsvariablen ab und fordert Headerinformationen an.

Request.Headers-Eigenschaft

Ruft eine Sammlung von HTTP-Headern ab.

Request.Headersist eine bessere Wahl als Request.ServerVariables, da Request.ServerVariablesalle Umgebungsvariablen sowie die Header enthalten sind, wobei Request.Headerseine viel kürzere Liste nur die Header enthält.

Die beste Lösung besteht also darin, die Request.HeadersSammlung zu verwenden, um den Wert direkt zu lesen. Beachten Sie jedoch die Warnungen von Microsoft bezüglich der HTML-Codierung des Werts, wenn Sie ihn in einem Formular anzeigen möchten.


2
Beachten Sie, dass der RefererHeader anders geschrieben ist als die HTTP_REFERRERServervariable.
Rudey

13

So: HttpRequest.UrlReferrer-Eigenschaft

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

2
Zum Schutz vor Null können Sie sagen: string actual = "" + Request.UrlReferrer ?? "(Standard)"; // (Standard) kann eine leere Zeichenfolge sein
Sheepy

10

Ich verwende .Net Core 2 mvc, dieses funktioniert für mich (um die Vorschauseite zu erhalten):

HttpContext.Request.Headers["Referer"];

9

Da Google Sie zu diesem Beitrag führt, wenn Sie nach C# Web API Referrerdem folgenden Angebot suchen : Web APIVerwendet einen anderen Typ Requestals normal MVC Requestgenannt, HttpRequestMessageder nicht enthalten ist UrlReferrer. Da eine normale Web APIAnfrage diese Informationen nicht enthält, müssen Ihre Kunden, wenn Sie sie wirklich benötigen, alles daran setzen, sie aufzunehmen. Obwohl Sie dies zu einem Teil Ihrer machen könnten, ist es API Objectbesser, es zu verwenden Headers.

Zunächst können Sie HttpRequestMessageeine UrlReferrer()Methode erweitern:

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

Dann müssen Sie Ihren Kunden die festlegen , Referrer Headerum ihre API Request:

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

Und jetzt Web API Requestenthält das die Referrer-Daten, auf die Sie wie folgt zugreifen können Web API:

Request.UrlReferrer();

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

1
Dies ist für ApiController. Das brauchte ich aber.
Csaba Toth

2

Irgendwann müssen Sie alle Links so geben

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

(in Option, wenn "Current" nicht gegründet wurde)


0

Zu einer anderen Antwort gehörend, habe ich eine Bedingungsklausel hinzugefügt, um null zu erhalten.

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.