0

我正在为我的 Web 应用程序使用 MVC4、C#、Castle Windsor、fluentnhibernate 堆栈,通常效果很好。

只是偶尔我会收到与 nHibernate 相关的错误,如下所示:

阅读器关闭时调用 Read 的尝试无效。

或者

内部连接致命错误。

当我连续打多个电话时,这通常会抬起头来。

目前,我正在从 JQuery 进行多个 ajax 获取时复制它。

我怀疑问题在于我的 NHibernate 会话管理。

我唯一能想到的是调用是有人使用同一个会话,第一个完成并关闭它,然后下面的调用无法完成。

由于我的会话处理方式是这样的,这不应该是可能的:

Kernel.Register(
                Component.For<ISessionFactory>()
                                .UsingFactoryMethod(_ => config.BuildSessionFactory()),
                Component.For<ISession>()
                                .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
                                .LifestylePerWebRequest());

每个请求应该是一个会话吗?

还有什么方法,或者我还能在哪里寻找问题?我很困惑。

4

1 回答 1

0

当然几分钟后解决了这个问题,但答案让我大开眼界。

这个答案使我走上了正确的道路。

虽然我所有的存储库、管理器和其他层都是使用 Castle Windsor 以正确的生活方式安装的,但有一个不是。

我正在从 ActionFilter 进行存储库调用,我的所有操作过滤器都是通过 ActionInvoker 类调用的,该类错误地注册为 Singleton,这导致了我的错误。

container.Register(Component.For<IActionInvoker>()
                                    .ImplementedBy<WindsorActionInvoker>()
                                    .LifeStyle.***Singleton***);

当然应该是

container.Register(Component.For<IActionInvoker>()
                                    .ImplementedBy<WindsorActionInvoker>()
                                    .LifeStyle.Transient);

再次提醒您密切关注这些生活方式。

于 2012-11-23T03:04:33.530 回答