NHibernate Versione: 2,1Richiesta NH per sessione - "La sessione è chiusa!"
sto usando quello che sembra essere un approccio HttpModule abbastanza standard per implementare le sessioni per-richiesta in un'applicazione ASP.NET + NHibernate. Sto cercando di sfruttare WebSessionContext
, ma non sembra funzionare correttamente. Nello specifico, tutto funziona alla perfezione per la prima richiesta sull'applicazione, ma le richieste aggiuntive risultano in una "Sessione chiusa!" eccezione ogni volta che viene utilizzata la sessione. La reimpostazione del pool di applicazioni consente di eseguire un'altra richiesta, quindi "Sessione è chiusa!".
Ci sono alcuni pezzi in movimento, ma non ne so abbastanza su come il contesto è gestito per restringerlo così ... ecco tutto!
Nel web.config:
<property name="current_session_context_class">
NHibernate.Context.WebSessionContext, NHibernate
</property>
(ho provato a installare a solo 'web', anche, con lo stesso risultato.)
Il modulo, confermato di essere configurato correttamente:
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);
}
}
E il mio piccolo aiutante:
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();
}
}
Grazie per il codice. Ho finito per usare qualcosa di simile. Sono ancora curioso di sapere perché il gestore di contesto della sessione web integrato non funzioni, in quanto viene utilizzato in una serie di esempi di codice. – dahlbyk