2011-04-25 74 views
3

我正在使用ASHX處理程序,我希望處理程序檢查Session!= null。System.NullReferenceException當檢查是否!= null

if (context.Session["Username"] != null) 

,我得到這個錯誤指向這一行:

System.NullReferenceException:未設置爲一個對象的實例對象引用。

什麼問題?

回答

10
if (context.Session["Username"] != null) 

請問您處理函數中實現IRequiresSessionState?否則會話可能不可用。

MSDN

指定目標HTTP處理程序 需要讀取和寫入訪問 會話狀態值。這是一個標記 接口並且沒有方法。

+1

是的 - 原來的評估是錯誤 – BrokenGlass 2011-04-25 00:51:08

+0

哦愚蠢的我, 我應該加上'IReadOnlySessionState' ... 我發現這個鏈接:http://www.hanselman.com/blog/ GettingSessionStateInHttpHandlersASHXFiles.aspx – Danpe 2011-04-25 00:51:18

1

是的我會說,檢查是否上下文不爲空。

4

像這樣使用它。其中一個封裝對象可能已空:

if (context != null) 
    if (context.Session != null) 
    if (context.Session["Username"] != null) { 
     // Do stuff 
} 
+3

堆疊如上所述的空檢查總是比較安全的,以便您可以精確定位問題的確切來源。看起來像一件苦差事,但收益。 – 2011-04-25 00:54:41

+1

如果Session沒有可用的代碼路徑,那麼這種方法是合理的 - 另一方面,如果期望Session存在並且你的代碼*取決於這個假設是一個很難的假設,那麼**失敗很快**方法就是讓它拋出一個異常,否則很可能你用空檢查掩蓋了這個問題。 – BrokenGlass 2011-04-25 01:37:29

+1

當然嵌套if語句應該用nested else來補充,在那裏它適合處理一個空對象(它不應該是null),並用合適的消息拋出一個適當的異常。 – 2011-04-25 01:43:41

0

我有一個.ashx文件的類似問題。解決方案是處理程序必須實現IReadOnlySessionState(用於只讀訪問)或IRequiresSessionState(用於讀寫訪問)。例如:

public class myModule: IHttpHandler, IRequiresSessionState { ... } 

這些接口不需要任何附加代碼,但是充當框架的標記。

希望這可以幫助。

喬納森

相關問題