NHibernate Версия: 2.1
Я использую, как представляется, довольно стандартный подход HttpModule для реализации сеансов по запросу в приложении ASP.NET + NHibernate. Я пытаюсь использовать WebSessionContext
, но, похоже, он работает неправильно. В частности, все отлично работает для первого запроса к приложению, но дополнительные запросы приводят к «Сессии закрыты!» исключение каждый раз, когда сеанс используется. Сброс пула приложений позволяет выполнить еще один запрос, а затем «Сессия закрыта!».
Есть несколько движущихся частей, но я не знаю достаточно о том, как контекст управляется, чтобы сузить его, так что ... вот и все!
В web.config:
<property name="current_session_context_class">
NHibernate.Context.WebSessionContext, NHibernate
</property>
(я тоже пытался установить его на «сеть» с тем же результатом.)
Модуль, подтвержденный для правильной настройки:
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);
}
}
И мой маленький помощник:
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();
}
}