NHibernate ISession的使用和线程安全性

3
当我将我的ISession生命周期配置为“每个HTTP请求”(我正在使用的Autofac中的InstancePerLifetimeScope)时,NHibernate分析器告诉我我的Session正在跨线程使用,这很可能是一个错误。发生了什么事情?我习惯于认为我应该将工作单元范围限定在http请求中,但似乎会跨越线程使用session。
基本上,“每个HTTP请求的ISession”与NHibernate分析器警报冲突。我错在哪里?
更新:我在Web.config中有一个ContainerDisposalModule,所以处理工作正常。

1
请默默点踩的用户留下评论说明原因,谢谢! - Valentin V
1
+1 给反对票计数器。这是一个完全合理的问题。 - jammycakes
你的Web.config文件中ContainerDisposalModule模块是否放在了正确的位置,以适配你所使用的IIS版本?另一个线程可能是终结器。 - Nicholas Blumhardt
1个回答

1

IIS(像大多数 Web 服务器一样)使用多个线程来服务请求,因此这可能不是您的应用程序中的错误,您可以安全地忽略这些警告。

请参见this question


我知道asp.net会在线程池中获取一个线程来执行每个请求。但据我所知,它不应该在单个请求内使用多个线程。每个请求都是单线程的,对吧? - Valentin V
@Valentin Vasiliev:如果是异步的话,它可以跳线程 - 不要假设所有工作都在同一个线程上处理。 - Ruben Bartelink
如果它是异步的 - 什么是异步?我没有使用异步控制器。而且我认为当控制器被实例化时,它的操作方法只会在一个线程上调用。那么问题仍然存在,NH prof如何能够检测到在asp.net mvc控制器一个实例中跨线程使用? - Valentin V
1
IIS/ASP.NET 可以并且确实使用多线程来处理单个请求。例如,它可能会在另一个线程上加载外部文件(如.js或图像)。您可以通过在Session_EndRequest 中释放ISession来轻松演示这一点——这有时会导致“没有会话或会话已关闭”错误。 - Jamie Ide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接