NHibernate Version: 2,1NH Yêu cầu mỗi phiên - "Phiên bị đóng!"
Tôi đang sử dụng những gì có vẻ là một cách tiếp cận khá HttpModule tiêu chuẩn để thực hiện phiên mỗi yêu cầu trong một ứng dụng ASP.NET + NHibernate. Tôi đang cố gắng tận dụng WebSessionContext
, nhưng nó dường như không hoạt động chính xác. Cụ thể, mọi thứ hoạt động xuất sắc cho yêu cầu đầu tiên trên ứng dụng, nhưng yêu cầu bổ sung dẫn đến "Phiên bị đóng!" ngoại lệ bất kỳ lúc nào phiên được sử dụng. Đặt lại nhóm ứng dụng cho phép yêu cầu khác thành công, sau đó thêm "Phiên được đóng!".
Có một vài mẩu di chuyển, nhưng tôi không biết đủ về cách bối cảnh được quản lý để thu hẹp nó xuống vì vậy ... đây là tất cả mọi thứ!
Trong web.config:
<property name="current_session_context_class">
NHibernate.Context.WebSessionContext, NHibernate
</property>
(Tôi đã thử thiết lập nó để chỉ 'web' cũng vậy, với kết quả tương tự.)
Module, khẳng định được cấu hình một cách chính xác:
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);
}
}
Và helper nhỏ của tôi:
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();
}
}
Cảm ơn mã. Tôi đã sử dụng một cái gì đó tương tự. Tôi vẫn tò mò tại sao trình quản lý ngữ cảnh phiên bản web được tích hợp không hoạt động, vì nó được sử dụng trong một loạt các mẫu mã. – dahlbyk