Asp.net IIS线程的NHIbernateIntegration ISessionManager问题

Asp.net IIS线程的NHIbernateIntegration ISessionManager问题,asp.net,nhibernate,iis,castle,Asp.net,Nhibernate,Iis,Castle,最近升级到NHibernate 3.10GA、Castle 2.5.2并使用Castle.Facilities.NHibernateIntegration的ASP.NET应用程序出现了一个非常奇怪的问题。我们正在使用NHibernateIntegration的ISessionManager和Web.SessionWebModule组件来管理请求-响应循环,并将其配置为isWeb=true 我们的应用程序返回一个url编码参数的页面,该页面随后还进行一些web服务调用 该问题间歇性出现,表现为NH

最近升级到NHibernate 3.10GA、Castle 2.5.2并使用Castle.Facilities.NHibernateIntegration的ASP.NET应用程序出现了一个非常奇怪的问题。我们正在使用NHibernateIntegration的ISessionManager和Web.SessionWebModule组件来管理请求-响应循环,并将其配置为isWeb=true

我们的应用程序返回一个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 7和asp.net 2.0上? 如果是,请尝试设置MaxConcurrentRequestsPerCPU


对于IIS来说,切换线程是非常正常的行为,这就是为什么永远不要使用线程静态变量。这似乎就是这里正在发生的事情。如果您确实在使用ASP.NET会话来保存NHibernate会话对象(ASP.NET应用程序中唯一安全的方法),您应该能够在HttpContext.Current.Items[“SessionWebModule.session”]中看到它。