Pobieranie strony odsyłającej HTTP w ASP.NET

103

Szukam szybkiego, łatwego i niezawodnego sposobu uzyskania strony odsyłającej HTTP przeglądarki w ASP.Net ( C # ). Wiem, że sama strona odsyłająca HTTP jest niewiarygodna, ale potrzebuję niezawodnego sposobu uzyskania strony odsyłającej, jeśli jest obecna.

Chuck Le Butt
źródło
W witrynie Asp.Net Core zobacz, jak uzyskać odsyłacz adresu URL w programie ASP.NET Core MVC?
Michael Freidgeim

Odpowiedzi:

166

Możesz użyć właściwości UrlReferrer bieżącego żądania:

Request.UrlReferrer

Spowoduje to odczytanie nagłówka HTTP Referer z żądania, które może, ale nie musi być dostarczone przez klienta (agenta użytkownika).

Darin Dimitrov
źródło
8
Należy zauważyć, że ta właściwość spowoduje zgłoszenie wyjątku System.UriFormatException, jeśli nagłówek HTTP odsyłacza jest nieprawidłowy.
NightOwl888
1
@Darin Dimitrov Próbuję stworzyć REST API używając WEB API. UrlReferrer nie jest częścią obiektu Request. Czy powinienem dodać trochę „używania” itp. Czego mi brakuje? DLL?
Ravi
1
Należy zauważyć, że różnica polega na pisowni jest poprawna. Nagłówek http zawiera błąd pisowni. MS używa poprawnej pisowni w nazwie właściwości. Niestety te dwa elementy nie pasują do siebie, co może powodować zamieszanie u niektórych osób (mnie) podczas testowania.
John
8
Zachowaj ostrożność, jeśli używasz Request.UrlReferrerpo ogłoszeniu zwrotnym po stronie serwera. Oczywiście Request.UrlReferrerbędzie teraz mieć wartość strony, na którą wysyłasz z powrotem. W większości przypadków ludzie potrzebują poprzedniej strony. W takim przypadku upewnij się, że poprzednia strona była przechowywana w, na przykład zmienną stanu widoku, podczas pierwszego ładowania strony. A kiedy uzyskasz dostęp do tej zmiennej, ma ona poprzednią stronę, z której przyszedłeś. Na przykład w zdarzeniu ładowania strony formularzy asp.net można wykonać:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
JonH
4
... a kiedy wrócisz, na przykład, możesz zrobić:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
JonH
20

Skorzystaj z Request.UrlReferrernieruchomości.

Pod scenami po prostu sprawdza ServerVariables("HTTP_REFERER")nieruchomość.

Zwolnij
źródło
2
Więc nie byłoby inaczej, gdybym użył: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Chuck Le Butt
2
W teorii nie ma różnicy, w praktyce nie mogę powiedzieć na pewno, ponieważ szybkie spojrzenie z reflektorem pokazuje, że UrlReferrerrobi o wiele więcej niż zwykłe połączenieServerVariables("HTTP_REFERER")
Diadistis
13
Mogę powiedzieć, że ServerVariables["HTTP_REFERER"]zwraca łańcuch , a Request.UrlReferrerzwraca Uri .
Chuck Le Butt
19
Request.Headers["Referer"]

Wyjaśnienie

Request.UrlRefererNieruchomość rzuci System.UriFormatExceptionjeśli Referer HTTP nagłówek jest niepoprawny (co może się zdarzyć, ponieważ zwykle nie jest pod kontrolą).

Jeśli chodzi o używanie Request.ServerVariables, według MSDN:

Kolekcja Request.ServerVariables

Kolekcja ServerVariables pobiera wartości z góry określonych zmiennych środowiskowych i informacje nagłówka żądania.

Właściwość Request.Headers

Pobiera kolekcję nagłówków HTTP.

Request.Headersjest lepszym wyborem niż Request.ServerVariables, ponieważ Request.ServerVariableszawiera wszystkie zmienne środowiskowe, a także nagłówki, gdzie Request.Headersjest znacznie krótsza lista, która zawiera tylko nagłówki.

Dlatego najlepszym rozwiązaniem jest użycie Request.Headerskolekcji do bezpośredniego odczytania wartości. Zwróć jednak uwagę na ostrzeżenia Microsoftu dotyczące kodowania wartości HTML, jeśli zamierzasz wyświetlić ją w formularzu.

NightOwl888
źródło
2
Zauważ, że Referernagłówek jest napisany inaczej niż HTTP_REFERRERzmienna serwera.
Rudey
13

W ten sposób: HttpRequest.UrlReferrer Property

Uri myReferrer = Request.UrlReferrer;
string actual = myReferrer.ToString();
Tomek
źródło
2
Aby zabezpieczyć się przed zerową wartością, możesz powiedzieć: string current = "" + Request.UrlReferrer ?? "(domyślna)"; // (domyślnie) może być pustym ciągiem znaków
Sheepy,
10

Używam mvc .Net Core 2, ten działa dla mnie (aby uzyskać stronę podglądów):

HttpContext.Request.Headers["Referer"];
Saad Hasan
źródło
9

Ponieważ Google przeniesie Cię do tego postu, szukając C# Web API Referrertutaj jest wiele: Web APIwykorzystuje inny typ Requestod normalnego MVC Requesto nazwie HttpRequestMessage, która nie obejmuje UrlReferrer. Ponieważ zwykłe Web APIżądanie nie zawiera tych informacji, jeśli naprawdę ich potrzebujesz, musisz nakłonić klientów do zrobienia wszystkiego, aby je uwzględnić. Chociaż możesz uczynić to częścią swojego API Object, lepszym sposobem jest użycie Headers.

Po pierwsze, możesz rozszerzyć, HttpRequestMessageaby udostępnić UrlReferrer()metodę:

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

Następnie klienci muszą ustawić Referrer Headerdo swoich API Request:

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

A teraz Web API Requestzawiera dane strony odsyłającej, do których możesz uzyskać dostęp w ten sposób z Web API:

Request.UrlReferrer();
Serj Sagan
źródło
2
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();
Donat Sasin
źródło
1
To jest dla ApiController. Właśnie tego potrzebowałem.
Csaba Toth
2

Kiedyś musisz podać wszystkie linki w ten sposób

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

(w opcji, gdy „Bieżący” nie został założony)

Sportac
źródło
0

Należąc do innej odpowiedzi, dodałem klauzulę warunkową dla uzyskania null.

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
mrbengi
źródło