2011-07-26 14 views
1

我們看到一個非常奇怪的問題,最近升級到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

+1

切換線程是IIS,這就是爲什麼你不應該使用線程靜態變量很正常的行爲。這似乎是這裏發生的事情。如果您確實使用ASP.NET會話來保存NHibernate會話對象(ASP.NET應用程序中唯一安全的方式),您應該能夠在HttpContext.Current.Items [「SessionWebModule.session」]中看到它。 –

回答