当引发EndPointNotFoundException WCF调用异常时,NHibernate会话(每个请求的会话)被关闭,如何解决这个问题?

时间:2011-10-18 10:16:04

标签: asp.net nhibernate spring.net

我们使用Spring.NET进行依赖注入,将NHibernate用作ORM。我们使用Session Per Request Model,并使用Spring.NET创建会话。在其中一个页面中,有一个webservice调用。当Web服务调用抛出EndPointNotFoundException异常时,NH会话关闭,我们得到'Lazy Initialization exception:'无法懒惰地初始化一个角色集合:,没有会话或会话被关闭(我们有一个Person对象,被加载页面加载,但Person对象有一组延迟加载的集合,如地址等。当访问其中一个延迟加载的集合时,抛出错误)。如果没有抛出异常,一切正常。有快速解决方案吗?

1 个答案:

答案 0 :(得分:0)

需要更多信息,但我会尝试进行计算猜测:

不处理抛出的异常,或者重新抛出处理的异常。 异常传播到页面错误处理程序。

在异常气泡管道的某处,异常处理程序调用{​​{1}}然后消耗异常(因此程序执行通过页面的呈现继续)

这种情况并不罕见,通常在对事务进行回滚时,建议也关闭ISession.Close()

请注意,可以在失败的提交上执行回滚+关闭,在这种情况下,失败的Web服务调用会以某种方式污染您的对象状态,因此提交失败。再次处理和使用异常。

细节之处在于,包含代理的nhibernate实体的一些代码路径仍然可以执行并尝试引用已关闭的ISession