2011-02-08 79 views
3
if (HttpContext.Current.Request.Cookies.AllKeys.Contains("myCookie") && 
    !String.IsNullOrEmpty(HttpContext.Current.Request.Cookies["myCookie"].Value)) 
{ 
    HttpCookie myCookie = HttpContext.Current.Request.Cookies["myCookie"]; 
} 

這段代碼有什麼問題嗎?每過一段時間,我們的製作網站都會在第4行收到一個空引用異常。我無法在測試中重現這一點。HttpContext Cookie

回答

9

您確定您在第4行看到異常,而不是第一行嗎?你的代碼看起來很好,只有一個例外:HttpContext.Current有時候是null,這會導致你的第一行代碼出現異常。

最常見的情況下,您會看到這是當您在後臺線程中運行代碼,而後臺線程與執行請求的線程不同時。例如,如果您自己創建線程,或者如果您在傳遞給BeginXXX異步方法調用的回調中執行代碼,則會得到空值HttpContext.Current

發生這種情況是因爲HttpContext.Current與請求當前正在執行的線程關聯。在另一個線程上,框架無法知道您要使用哪個請求。

有辦法解決這個問題 - 例如.NET的BackgroundWorker可以傳播上下文到另一個線程。 ASP.NET中的異步頁面支持也會正確傳播上下文。

所以,你有兩個選擇:要麼重寫你的所有異步代碼中使用的上下文傳遞異步機制,例如BackgroundWorker或異步頁,或更改你的代碼試圖訪問的HttpContext.Current任何屬性之前檢查HttpContext.Current==null

+0

是的,它是第4行拋出異常。 – harmony 2011-02-08 20:30:53