2011-07-26 15 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”]中看到它。 –

回答