我们看到一个非常奇怪的问题,最近升级到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”]中看到它。 –