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.



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


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.


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.


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();

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"];

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();

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

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)


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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.