2012-08-09 71 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返回。

相關問題