2009-08-28 69 views
0

使用由aspnet_state管理的outproc會話。有時我會遇到運行時錯誤,指出會話無效。所以我想檢查會話是否對我提出的每個請求都有效。但我找不到像使用Java的this Question一樣的正確方法。如何檢查asp會話是否有效?

這裏是我現在在page_preinit事件中使用的代碼。它看起來很醜,但它的工作原理。

  Try 
       Dim x = Session.Keys().Item(0) 
      Catch ex As Exception 
       Session.Clear() 
      End Try 

有沒有人知道更好的方法?

謝謝

+0

什麼是你得到確切的運行時消息?它不會響鈴,以及您在上面的測試中基於空引用異常進行測試的方式,該異常也會發生在新/空會話而不是無效會話的情況下。 – olle 2009-08-28 21:56:48

+0

您使用表單身份驗證嗎? – PortageMonkey 2009-08-28 23:32:02

+0

olle:會話確實存在(NOT NULL),但訪問任何元素都會引發異常。這只是不時發生,只有在我的開發機器上,因爲我做了大量的構建/重建 – Youssef 2009-08-31 15:59:21

回答

0

其實我通過檢查會話的第一個元素(session.item(0)) 來解決問題我把代碼放在try catch中。如果有例外,我只是清除會話。此代碼位於我所有頁面的底部頁面中。

所以在preinit事件我的代碼看起來像這樣

Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit 
    Try 
     Dim x = Session.Keys().Item(0) 
    Catch ex As Exception 
     Session.Clear() 
    End Try 
End Sub 

這似乎是醜陋的,但它確實解決了我的問題。

謝謝大家。

1

您可以嘗試檢查上下文對象。

C#

if(Context.Session != null) 
{ 
    //Redirect to login page etc 
} 

VB(用一個C#到VB轉換器here..not知道如果這是正確的)

If Context.Session IsNot Nothing Then 
    'Redirect to login page etc 
End If 

如果您正在使用窗體身份驗證,這是設置正確,它應該爲你重定向。如果仍然需要明確,我建議將這種類型的代碼放在Global.asax或每個頁面可以派生的基類中,而不是將其添加到每個請求中。

+0

我使用的代碼是在基本頁面上。但會話確實存在,它不是null。訪問eny元素將引發異常。通過簡單地重新啓動asp_net會話問題,或者在代碼中清理它。我正在使用的代碼確實解決了我的問題,但我想知道是否有其他人這樣做。 – Youssef 2009-08-31 16:03:52

+0

嗯。這聽起來像是你的會話信息(密鑰)沒有被正確填充......而不是會話超時。我們使用aspnet_state DB有類似的問題。我們的方法是嘗試訪問會話密鑰,除了檢查null以驗證aspnet_state DB返回有效的會話對象。至於aspnet_state DB返回的會話壞的根本問題...仍然還沒有解決的一個 – PortageMonkey 2009-08-31 17:27:41

0

只需選中Session.Count,而不是試圖訪問一個錯誤處理區塊中的第一項...

+0

不,計數沒有幫助,因爲計數是正確的。會話中有元素,但它們已損壞一些原因。你可以在運行一段時間後使用proc會話來複制它(大量訪問)它會開始崩潰。這可能是內存問題。我沒有徹底調查過,但try catch對我來說工作正常。 – Youssef 2009-11-12 15:53:47