gpt4 book ai didi

asp.net - 每个 session 的 NH 请求 - "Session is closed!"

转载 作者:行者123 更新时间:2023-12-04 08:46:34 25 4
gpt4 key购买 nike

NHibernate 版本: 2.1

我正在使用似乎是一种非常标准的 HttpModule 方法在 ASP.NET+NHibernate 应用程序中实现按请求 session 。我正在尝试利用 WebSessionContext ,但它似乎无法正常工作。具体来说,应用程序上的第一个请求一切正常,但其他请求会导致“ session 已关闭!”每次使用 session 时都会出现异常。重置应用程序池允许另一个请求成功,然后更多“ session 已关闭!”。

有一些动人的部分,但我不太了解上下文是如何缩小范围的,所以......这就是一切!

在 web.config 中:

<property name="current_session_context_class">
NHibernate.Context.WebSessionContext, NHibernate
</property>

(我也尝试将其设置为“web”,结果相同。)

模块,确认配置正确:
public class NHibernateSessionModule : IHttpModule
{
public void Dispose() { }

public void Init(HttpApplication context)
{
Debug.WriteLine("NHibernateSessionModule.Init()");
context.BeginRequest += context_BeginRequest;
context.EndRequest += context_EndRequest;
}

void context_BeginRequest(object sender, EventArgs e)
{
Debug.WriteLine("NHibernateSessionModule.BeginRequest()");
var session = NHibernateHelper.OpenSession();
session.BeginTransaction();
CurrentSessionContext.Bind(session);
}

void context_EndRequest(object sender, EventArgs e)
{
Debug.WriteLine("NHibernateSessionModule.EndRequest()");
var session = NHibernateHelper.GetCurrentSession();
if (session != null)
{
try
{
if (session.Transaction != null && session.Transaction.IsActive)
session.Transaction.Commit();
}
catch (Exception ex)
{
session.Transaction.Rollback();
throw new ApplicationException("Error committing database transaction", ex);
}
finally
{
session.Close();
}
}
CurrentSessionContext.Unbind(NHibernateHelper.SessionFactory);
}
}

还有我的小 helper :
public class NHibernateHelper
{
public static readonly ISessionFactory SessionFactory;

static NHibernateHelper()
{
try
{
Configuration cfg = new Configuration();
cfg.AddAssembly(Assembly.GetCallingAssembly());
SessionFactory = cfg.Configure().BuildSessionFactory();
}
catch (Exception ex)
{
Debug.WriteLine(ex);
throw new ApplicationException("NHibernate initialization failed", ex);
}
}

public static ISession GetCurrentSession()
{
return SessionFactory.GetCurrentSession();
}

public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}

最佳答案

NHibernate 1.2 的示例(来自 NHibernate in Action)显示解除绑定(bind)是在关闭之前完成的。

这种订购方式的改变有帮助吗?

var session = NHibernateHelper.GetCurrentSession();
CurrentSessionContext.Unbind(NHibernateHelper.SessionFactory);
...
session.Close();

关于asp.net - 每个 session 的 NH 请求 - "Session is closed!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1103837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com