NHibernate Versión: 2,1NH Request Per Session - "¡La sesión está cerrada!"
estoy usando lo que parece ser un enfoque HttpModule bastante estándar para la implementación de sesiones por-petición en una aplicación ASP.NET + NHibernate. Estoy tratando de aprovechar WebSessionContext
, pero parece que no funciona correctamente. Específicamente, todo funciona de manera brillante para la primera solicitud en la aplicación, pero las solicitudes adicionales resultan en una "¡Sesión cerrada!" excepción en cualquier momento que se use la sesión. Restablecer el grupo de aplicaciones permite que otra solicitud tenga éxito, luego más "¡La sesión está cerrada!".
Hay algunas piezas en movimiento, pero no sé lo suficiente sobre cómo se maneja el contexto para reducirlo así que ... ¡aquí está todo!
En web.config:
<property name="current_session_context_class">
NHibernate.Context.WebSessionContext, NHibernate
</property>
(He tratado de establecer que simplemente 'red', también, con el mismo resultado.)
El módulo, confirmó que ser configurado correctamente:
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);
}
}
Y mi pequeño ayudante:
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();
}
}
Gracias por el código. Terminé usando algo similar. Sigo sintiendo curiosidad por saber por qué el administrador de contexto de sesión web incorporado no funciona, ya que se usa en muchos ejemplos de código. – dahlbyk