我們看到一個非常奇怪的問題,最近升級到NHibernate 3.10GA,城堡2.5.2,並使用Castle.Facilities.NHibernateIntegration的ASP.NET應用程序。我們使用NHibernateIntegration中的ISessionManager和Web.SessionWebModule組件來管理我們的請求響應循環,並使用isWeb = true進行配置。NHIbernateIntegration與IIS線程的ISessionManager問題
我們的應用程序返回一個url編碼參數的頁面,這個頁面隨後也會進行一些web服務調用。
該問題非常間歇地發生,並表現爲NHibernate.LazyInitializationException - 無法初始化代理 - 沒有會話錯誤,這是由主對象延遲加載多對一關係引起的。這表明會話對象在頁面的請求 - 響應循環中正在丟失。
我們決定調試Castle.Facilities.NHibernation中的OnBeginRequest和OnEndRequest方法,並添加了一些調試語句來標識線程。我們發現如下:
在出現錯誤的情況下,OnBeginRequest中的threadId確實與不匹配,與OnEndRequest中的threadId匹配;並且進一步看來,原始線程正在用於其他請求和響應。當最初的頁面請求最終返回時,它的threadid與它啓動時的原始threadid不匹配。有沒有人看過類似的東西?
這裏是調試數據。注[9]是指根據log4net的
[9] DEBUG SessionWebModule - On begin request thread id: 9 for MyPage.aspx
[9] DEBUG SessionWebModule - On begin request thread id: 9 for example.ashx
[9] DEBUG SessionWebModule - On end request thread id: 9 example.ashx
[9] DEBUG SessionWebModule - On begin request thread id: 9 for WebService.asmx/js
[9] DEBUG SessionWebModule - On end request thread id: 9 for WebService.asmx/js
[6] ERROR NHibernate.LazyInitializationException - [error message describing relationship] -Could not initialize proxy - no Session.
[6] DEBUG SessionWebModule - On end request thread id: 9 for MyPage.aspx
注意顯示該頁面請求起源於螺紋9的第一和最後一行的起始線程,但線程6
切換線程是IIS,這就是爲什麼你不應該使用線程靜態變量很正常的行爲。這似乎是這裏發生的事情。如果您確實使用ASP.NET會話來保存NHibernate會話對象(ASP.NET應用程序中唯一安全的方式),您應該能夠在HttpContext.Current.Items [「SessionWebModule.session」]中看到它。 –