Mendapatkan Perujuk HTTP di ASP.NET

103

Saya mencari cara yang cepat, mudah dan dapat diandalkan untuk mendapatkan Perujuk HTTP browser di ASP.Net ( C # ). Aku tahu HTTP Perujuk itu sendiri tidak dapat diandalkan, tapi saya ingin cara yang dapat diandalkan untuk mendapatkan pengarah jika ini hadir.

Chuck Le Butt
sumber

Jawaban:

166

Anda dapat menggunakan properti UrlReferrer dari permintaan saat ini:

Request.UrlReferrer

Ini akan membaca header HTTP Referer dari permintaan yang mungkin atau mungkin tidak disediakan oleh klien (agen pengguna).

Darin Dimitrov
sumber
8
Perlu diperhatikan bahwa properti ini akan menampilkan System.UriFormatException jika header HTTP referer salah format.
NightOwl888
1
@Darin Dimitrov Saya mencoba membuat REST API menggunakan WEB API. UrlReferrer bukan bagian dari objek Request. Haruskah saya menambahkan beberapa "menggunakan" dll. Apa yang saya lewatkan? sebuah DLL?
Ravi
1
Perlu dicatat bahwa Perbedaannya adalah ejaan yang benar. Tajuk http salah eja. MS menggunakan ejaan yang benar dalam nama properti. Sayangnya, keduanya tidak cocok, yang dapat menyebabkan beberapa orang (saya) kebingungan saat melakukan pengujian.
Yohanes
8
Hati-hati jika Anda menggunakan Request.UrlReferrersetelah postback sisi server. Tentu saja Request.UrlReferrersekarang akan memiliki nilai halaman yang Anda posting kembali. Dalam banyak kasus, orang membutuhkan halaman sebelumnya. Dalam kasus ini, pastikan Anda menyimpan halaman sebelumnya, katakanlah variabel kondisi tampilan saat halaman pertama kali dimuat. Dan kemudian ketika Anda mengakses variabel ini, ia memiliki halaman sebelumnya tempat Anda berasal. Misalnya, dalam acara pemuatan halaman formulir asp.net Anda dapat melakukan:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
JonH
4
... dan ketika Anda memposting kembali misalnya, Anda dapat melakukan:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
JonH
20

Gunakan Request.UrlReferrerproperti.

Di bawah layar itu hanya memeriksa ServerVariables("HTTP_REFERER")properti.

Singkirkan
sumber
2
Jadi tidak akan ada perbedaan jika saya menggunakan: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Chuck Le Butt
2
Secara teori tidak ada perbedaan, dalam praktiknya saya tidak dapat mengatakan dengan pasti karena sekilas dengan pertunjukan reflektor yang UrlReferrermelakukan lebih dari sekedar panggilan sederhana keServerVariables("HTTP_REFERER")
Diadistis
13
Saya dapat memberi tahu Anda bahwa ServerVariables["HTTP_REFERER"]mengembalikan string , sedangkan Request.UrlReferrermengembalikan Uri .
Chuck Le Butt
19
Request.Headers["Referer"]

Penjelasan

The Request.UrlRefererproperti akan melempar System.UriFormatExceptionjika referal HTTP header kelainan bentuk (yang bisa terjadi karena tidak biasanya di bawah kendali Anda).

Adapun penggunaan Request.ServerVariables, per MSDN:

Request.ServerVariables Collection

Kumpulan ServerVariables mengambil nilai variabel lingkungan yang telah ditentukan dan meminta informasi header.

Request.Headers Property

Mendapat kumpulan header HTTP.

Request.Headersadalah pilihan yang lebih baik daripada Request.ServerVariables, karena Request.ServerVariablesberisi semua variabel lingkungan serta header, di mana Request.Headersdaftar yang lebih pendek yang hanya berisi header.

Jadi solusi terbaik adalah menggunakan Request.Headerscollection untuk membaca nilainya secara langsung. Perhatikan peringatan Microsoft tentang pengkodean nilai HTML jika Anda akan menampilkannya di formulir.

NightOwl888
sumber
2
Perhatikan bahwa Referertajuk dieja secara berbeda dari HTTP_REFERRERvariabel server.
Rudey
13

Seperti ini: HttpRequest.UrlReferrer Property

Uri myReferrer = Request.UrlReferrer;
string actual = myReferrer.ToString();
Tom
sumber
2
Untuk melindungi terhadap null, Anda dapat mengatakan: string actual = "" + Request.UrlReferrer ?? "(default)"; // (default) boleh berupa string kosong
Sheepy
10

Saya menggunakan .Net Core 2 mvc, yang ini berfungsi untuk saya (untuk mendapatkan halaman pratinjau):

HttpContext.Request.Headers["Referer"];
Saad Hasan
sumber
9

Karena Google membawa Anda ke posting ini ketika mencari, C# Web API Referrerinilah kesepakatannya: Web APImenggunakan jenis yang berbeda Requestdari yang biasa MVC Requestdisebut HttpRequestMessageyang tidak termasuk UrlReferrer. Karena Web APIpermintaan normal tidak menyertakan informasi ini, jika Anda benar-benar membutuhkannya, Anda harus meminta klien Anda untuk memasukkannya. Meskipun Anda bisa menjadikan ini bagian dari Anda API Object, cara yang lebih baik adalah dengan menggunakannya Headers.

Pertama, Anda dapat memperluas HttpRequestMessageuntuk memberikan UrlReferrer()metode:

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

Kemudian klien Anda perlu menyetel Referrer Headerke API Request:

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

Dan sekarang Web API Requesttermasuk data perujuk yang dapat Anda akses seperti ini dari Web API:

Request.UrlReferrer();
Serj Sagan
sumber
2
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();
Donat Sasin
sumber
1
Ini untuk ApiController. Itulah yang saya butuhkan.
Csaba Toth
2

Terkadang Anda harus memberikan semua tautan seperti ini

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

(dalam opsi saat "Saat Ini" tidak ditemukan)

Sportac
sumber
0

Milik balasan lain, saya telah menambahkan klausul kondisi untuk mendapatkan null.

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
mrbengi
sumber