2012-08-09 95 views
3

我尝试使用下面的代码获取引用URL在Global.asax中的session_start:HttpContext.Current.Request.ServerVariables [ “HTTP_REFERER”]空

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

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

但我变空了。你能告诉我什么是错误的或替代的?

+1

我想你可以使用'Request.UrlReferrer'。 – yogi 2012-08-09 07:18:37

+0

没有理由对一个合法的问题进行倒票。这里所做的事似乎很愚蠢,但这并不能使问题变得无效。 – cjbarth 2013-02-04 17:51:05

回答

6

并非所有用户代理发送引荐,有些代理服务器/中介引荐,并且经常有简单没有引荐。

只需检查Request.UrlReferrer == null在某个点;如果是的话,不要试图看着Request.UrlReferrer.AbsoluteUri

这里没有什么“错误”,对此你什么也做不了。如果你不知道它们来自哪里,那么你只需要忍受它。

2

我知道这个答案是晚了大约2年半,但我找不到在UrlReferrer属性彻底写出来,所以我想我会在这里添加此信息。 @ MarcGravell的答案大部分都是正确的,但它错过了另外一种可能性。 HTTP标头中指定的引荐来源的值也可能是无效的URI。

因此,在HttpRequest上使用UrlReferrer属性时应该小心。如果您查看UrlReferrer使用类似ILSpy的方式调用时执行的代码,您会看到它试图解析请求头中的值。如果该标题中的值不是有效的URI,则会得到System.UriFormatException

这意味着如果在尝试访问AbsoluteUri之前简单检查UrlReferrer,如果引用链接不是有效的URI,可能会导致未处理的异常。如果您需要有效的Urinull,则必须先使用Request.ServerVariables["HTTP_REFERER"],然后使用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返回。