在 ASP.NET 中获取 HTTP 引用

我正在寻找一个快速,简单和可靠的方式获得浏览器的 HTTP 引用ASP.Net(C # )。我知道 HTTP 引用程序本身是不可靠的,但是我确实想要一个可靠的方法来获得引用程序,如果它 存在的话。

215218 次浏览

您可以使用当前请求的 UrlReferrer属性:

Request.UrlReferrer

这将从客户端(用户代理)提供或不提供的请求中读取 推荐人 HTTP 头。

使用 Request.UrlReferrer属性。

在场景下面,它只是检查 ServerVariables("HTTP_REFERER")属性。

像这样: UrlReferrer 属性

Uri myReferrer = Request.UrlReferrer;
string actual = myReferrer.ToString();
Request.Headers["Referer"]

解释

如果引用 HTTP 头格式不正确(这种情况可能发生,因为它通常不在您的控制之下) ,则 Request.UrlReferrer属性将抛出 System.UriFormatException

Therefore, the Request.UrlReferrer property is not 100% reliable - it may contain data that cannot be parsed into a Uri class. To ensure the value is always readable, use Request.Headers["Referer"] instead.

至于像其他人建议的那样使用 Request.ServerVariables,根据 MSDN:

请求。服务器变量集合

ServerVariables 集合检索预定环境变量和请求头信息的值。

请求,头部属性

获取 HTTP 标头的集合。

Request.Headers是一个比 Request.ServerVariables更好的选择,因为 Request.ServerVariables包含所有的环境变量以及头部,其中 Request.Headers是一个更短的列表,只包含头部。

因此,最可靠的解决方案是使用 Request.Headers集合直接读取值。但是,如果要在表单上显示这个值,一定要注意微软关于 HTML 编码的警告。

因为谷歌把你带到这篇文章时,搜索 C# Web API Referrer这里的交易: Web API使用一个不同类型的 Request从正常的 MVC Request称为 HttpRequestMessage,其中不包括 UrlReferrer。因为一个正常的 Web API请求不包含这些信息,所以如果您真的需要它,您必须让您的客户特意包含它。尽管你可以把它作为你的 API Object的一部分,一个更好的方法是使用 Headers

首先,可以扩展 HttpRequestMessage以提供 UrlReferrer()方法:

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

然后,你的客户需要将 Referrer Header设置为他们的 API Request:

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

现在 Web API Request包含了引用数据,你可以像这样从你的 Web API访问:

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

我正在使用.Net Core 2 mvc, 这个对我有用(获得预览页面) :

HttpContext.Request.Headers["Referer"];

有时候你必须像这样给所有的链接

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

(当“ Current”未建立时可选)

属于其他回复,我增加了获得空的条件子句。

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

使用.NET Core 或.NET 5我建议这样做:

httpContext.Request.Headers.TryGetValue("Referer", out var refererHeader)