Lấy liên kết giới thiệu HTTP trong ASP.NET


103

Tôi đang tìm một cách nhanh chóng, dễ dàng và đáng tin cậy để lấy Liên kết giới thiệu HTTP của trình duyệt trong ASP.Net ( C # ). Tôi biết các HTTP Người giới thiệu bản thân là không đáng tin cậy, nhưng tôi muốn có một cách đáng tin cậy của nhận được giới thiệu nếu nó hiện tại.



Câu trả lời:


166

Bạn có thể sử dụng thuộc tính UrlReferrer của yêu cầu hiện tại:

Request.UrlReferrer

Thao tác này sẽ đọc tiêu đề HTTP giới thiệu từ yêu cầu mà có thể được hoặc không được cung cấp bởi máy khách (tác nhân người dùng).


8
Cần lưu ý rằng thuộc tính này sẽ ném ra một System.UriFormatException nếu tiêu đề HTTP giới thiệu không đúng định dạng.
NightOwl888

1
@Darin Dimitrov Tôi đang cố gắng tạo API REST bằng API WEB. UrlReferrer không phải là một phần của đối tượng Yêu cầu. Tôi có nên thêm một số "using", v.v. Tôi còn thiếu gì không? một DLL?
Ravi

1
Cần lưu ý rằng Sự khác biệt là cách viết chính xác. Tiêu đề http bị sai chính tả. MS sử dụng cách viết đúng trong tên tài sản. Thật không may, cả hai không khớp, có thể khiến một số người (tôi) nhầm lẫn khi thử nghiệm.
John

8
Hãy cẩn thận nếu bạn đang sử dụng Request.UrlReferrersau khi đăng lại phía máy chủ. Tất nhiên Request.UrlReferrerbây giờ sẽ có giá trị của trang bạn đang đăng trở lại. Trong hầu hết các trường hợp, mọi người cần trang trước đó. Trong trường hợp này, hãy đảm bảo rằng bạn đang lưu trữ trang trước, giả sử là một biến trạng thái xem khi trang tải lần đầu tiên. Và sau đó khi bạn truy cập biến này, nó có trang trước đó mà bạn đến. Ví dụ: trong sự kiện tải trang của biểu mẫu asp.net, bạn có thể làm:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
JonH

4
... và khi bạn đăng lại chẳng hạn, bạn có thể làm:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
JonH

20

Sử dụng Request.UrlReferrertài sản.

Bên dưới hiện trường, nó chỉ đang kiểm tra ServerVariables("HTTP_REFERER")tài sản.


2
Vì vậy, sẽ không có gì khác biệt nếu tôi sử dụng: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Chuck Le Butt

2
Về lý thuyết không có sự khác biệt, trong thực tế tôi không thể nói chắc chắn từ một cái nhìn nhanh chóng với chương trình phản xạ mà UrlReferrerkhông nhiều hơn một cuộc gọi đơn giản đểServerVariables("HTTP_REFERER")
Diadistis

13
Tôi có thể nói với bạn rằng ServerVariables["HTTP_REFERER"]trả về một chuỗi , trong khi Request.UrlReferrertrả về một Uri .
Chuck Le Butt

19
Request.Headers["Referer"]

Giải trình

Các Request.UrlRefererbất động sản sẽ ném một System.UriFormatExceptionnếu referer tiêu đề HTTP là bị thay đổi (có thể xảy ra vì nó không phải là thường dưới sự kiểm soát của bạn).

Đối với việc sử dụng Request.ServerVariables, theo MSDN:

Bộ sưu tập Request.ServerVariables

Bộ sưu tập ServerVariables truy xuất các giá trị của các biến môi trường được xác định trước và yêu cầu thông tin tiêu đề.

Thuộc tính Request.Headers

Nhận một bộ sưu tập các tiêu đề HTTP.

Request.Headerslà một lựa chọn tốt hơn Request.ServerVariablesRequest.ServerVariableschứa tất cả các biến môi trường cũng như các tiêu đề, trong đó Request.Headersdanh sách ngắn hơn nhiều chỉ chứa các tiêu đề.

Vì vậy, giải pháp tốt nhất là sử dụng Request.Headersbộ sưu tập để đọc giá trị trực tiếp. Tuy nhiên, hãy chú ý đến các cảnh báo của Microsoft về việc mã hóa HTML nếu bạn định hiển thị nó trên một biểu mẫu.


2
Lưu ý rằng Referertiêu đề được viết khác với HTTP_REFERRERbiến máy chủ.
Rudey

13

Như thế này: Thuộc tính HttpRequest.UrlReferrer

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

2
Để bảo vệ khỏi null, bạn có thể nói: string real = "" + Request.UrlReferrer ?? "(mặc định)"; // (mặc định) có thể là chuỗi rỗng
Sheepy

10

Tôi đang sử dụng .Net Core 2 mvc, cái này phù hợp với tôi (để lấy trang xem trước):

HttpContext.Request.Headers["Referer"];

9

Vì Google đưa bạn đến bài đăng này khi tìm kiếm C# Web API Referrerđây là thỏa thuận: Web APIsử dụng một loại khác với loại Requestthông thường MVC Requestđược gọi là HttpRequestMessagekhông bao gồm UrlReferrer. Vì một Web APIyêu cầu thông thường không bao gồm thông tin này, nếu bạn thực sự cần nó, bạn phải yêu cầu khách hàng của mình cố gắng đưa nó vào. Mặc dù bạn có thể biến điều này thành một phần của mình API Object, nhưng cách tốt hơn là sử dụng Headers.

Trước tiên, bạn có thể mở rộng HttpRequestMessageđể cung cấp một UrlReferrer()phương pháp:

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

Sau đó, khách hàng của bạn cần phải đặt Referrer Headerđể họ API Request:

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

Và bây giờ Web API Requestbao gồm dữ liệu liên kết giới thiệu mà bạn có thể truy cập như thế này từ Web API:

Request.UrlReferrer();

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

1
Đây là dành cho ApiController. Đó là những gì tôi cần mặc dù.
Csaba Toth

2

Đôi khi bạn phải cung cấp tất cả các liên kết như thế này

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

(trong tùy chọn khi "Hiện tại" không được thành lập)


0

Thuộc về câu trả lời khác, tôi đã thêm điều khoản điều kiện để nhận được null.

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.