4

我正在尝试使用以下代码在 global.asax session_start 中获取引用 url:

HttpContext.Current.Request.ServerVariables["HTTP_REFERER"]

我尝试使用Request.UrlReferrer.AbsoluteUri but UrlReferrer也是空的。

但我越来越空了。你能告诉我什么是错的或替代的吗?

4

2 回答 2

6

并非所有的用户代理都会发送推荐人,一些代理/中介会剥离推荐人,而且通常根本没有推荐人。

只需检查是否Request.UrlReferrer == null在某个时候;如果是,请不要尝试查看Request.UrlReferrer.AbsoluteUri.

这里没有什么“错误”,你也无能为力。如果您不知道它们来自哪里,那么您将不得不忍受它。

于 2012-08-09T07:20:10.013 回答
2

我知道这个答案大约晚了 2 1/2 年,但我找不到关于该UrlReferrer物业的详尽文章,所以我想我会在此处添加此信息。@MarcGravell 的回答在很大程度上是正确的,但它错过了另一种可能性。HTTP 标头中指定的引用者值也可能是无效的 uri。

因此,在使用 上的UrlReferrer属性时应该小心HttpRequest。如果您查看UrlReferrer使用 ILSpy 之类的调用时执行的代码,您会看到它尝试解析请求标头中的值。如果该标头中的值不是有效的 uri,您将获得一个System.UriFormatException.

这意味着如果引用者不是有效的 uri,则UrlReferrer在尝试访问之前简单地检查 null可能会给您留下未处理的异常。AbsoluteUri如果您想要一个有效的Urior null,则必须使用Request.ServerVariables["HTTP_REFERER"]and then Uri.TryParse,否则您必须将Request.UriReferrer == null支票包装在try-catch.

我整理了一个快速演示来展示该UrlReferrer属性的行为。以以下页面为例:

<%@ Page Language="C#" AutoEventWireup="true" %>
<html><body>
        <table border="1">
            <tr><td>Referrer</td><td><%= GetUrlReferrer() %></td></tr>
        </table>
</body></html>
<script runat="server">
public string GetUrlReferrer()
{
    try
    {
        return Request.UrlReferrer == null ? "(None)" : Request.UrlReferrer.ToString();
    }
    catch (Exception ex)
    {
        return Request.ServerVariables["HTTP_REFERER"] + " (from Server Variable)";
    }
}    
</script>

将此页面设置为在 下运行http://localhost/urlreferrertest.aspx,然后尝试从 Powershell 使用无效 Uri 调用它:

> $client = new-object System.Net.WebClient
> $client.Headers.Add("Referer", "http://www%2etest%2e.com/test.html")
> $client.DownloadString("http://localhost/urlreferrertest.aspx")

如果您单步执行代码,您将看到对 的调用Request.UrlReferrer引发异常,并且http://www%2etest%2e.com/test.html通过访问ServerVariable.

于 2015-03-04T02:58:06.520 回答