這是我今天遇到的另一個奇怪的問題!我創建了使用nhibernate的MVC 4應用程序。並在我的HomeController上添加了名爲[LoggingNHibernateSessionAttribute]的過濾器屬性,該屬性管理每個操作的會話。我遵循'ASP.NET MVC4和Apress發佈的Web API'。NHibernate會話關閉時,頁面
public class LoggingNHibernateSessionAttribute : ActionFilterAttribute
{
private readonly IActionLogHelper _actionLogHelper;
private readonly IActionExceptionHandler _actionExceptionHandler;
private readonly IActionTransactionHelper _actionTransactionHelper;
public LoggingNHibernateSessionAttribute()
: this(WebContainerManager.Get<IActionLogHelper>(),
WebContainerManager.Get<IActionExceptionHandler>(),
WebContainerManager.Get<IActionTransactionHelper>())
{
}
public LoggingNHibernateSessionAttribute(
IActionLogHelper actionLogHelper,
IActionExceptionHandler actionExceptionHandler,
IActionTransactionHelper actionTransactionHelper)
{
_actionLogHelper = actionLogHelper;
_actionExceptionHandler = actionExceptionHandler;
_actionTransactionHelper = actionTransactionHelper;
}
public override void OnActionExecuting(ActionExecutingContext actionExectingContext)
{
_actionLogHelper.LogEntry(actionExectingContext.ActionDescriptor);
_actionTransactionHelper.BeginTransaction();
}
public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
{
_actionTransactionHelper.EndTransaction(actionExecutedContext);
_actionTransactionHelper.CloseSession();
_actionExceptionHandler.HandleException(actionExecutedContext);
_actionLogHelper.LogExit(actionExecutedContext.ActionDescriptor);
}
}
ActionTransactionHelper
public class ActionTransactionHelper : IActionTransactionHelper
{
private readonly ISessionFactory _sessionFactory;
private readonly ICurrentSessionContextAdapter _currentSessionContextAdapter;
public ActionTransactionHelper(
ISessionFactory sessionFactory,
ICurrentSessionContextAdapter currentSessionContextAdapter)
{
_sessionFactory = sessionFactory;
_currentSessionContextAdapter = currentSessionContextAdapter;
}
public void BeginTransaction()
{
var session = _sessionFactory.GetCurrentSession();
if (session != null)
{
session.BeginTransaction();
}
}
public bool TransactionHandled { get; private set; }
public void EndTransaction(ActionExecutedContext filterContext)
{
var session = _sessionFactory.GetCurrentSession();
if (session == null) return;
if (!session.Transaction.IsActive) return;
if (filterContext.Exception == null)
{
session.Flush();
session.Transaction.Commit();
}
else
{
session.Transaction.Rollback();
}
TransactionHandled = true;
}
public bool SessionClosed { get; private set; }
public void CloseSession()
{
if (_currentSessionContextAdapter.HasBind(_sessionFactory))
{
var session = _sessionFactory.GetCurrentSession();
session.Close();
session.Dispose();
_currentSessionContextAdapter.Unbind(_sessionFactory);
SessionClosed = true;
}
}
}
運行應用程序時,我可以在數據庫中保存的實體。但是當我點擊刷新按鈕和異常拋出指示會話關閉。
我不知道爲什麼會發生這種情況。 (我搜索並找到這個NHibernate throwing Session is closed,但無法解決我的問題)。
在我的NinjectConfigurator中,我將inRequestScope()添加到所有注入但沒有答案。我檢查了什麼時候刷新頁面會話將被打開。但我不知道它爲什麼說會議閉幕?!
UPDATE:
當我第一次運行該應用程序。我可以創建一個新成員。但是當我點擊刷新按鈕時,會話將意外關閉! 第一次運行:
- 一切擊中刷新按鈕後,效果很好
:
- 一個新的會話綁定到當前上下文。
- 新的會話將被注入該庫(會話是打開的)
- 的ActionTransactionHelper調用的BeginTransaction() 4- customMembership的createUser(....)稱爲 5但當_userRepositoy.save(用戶)稱爲在存儲庫會話關閉!!!!
注意:但是當仍然沒有調用endTransaction和closeSession時。但會議如何關閉?如果我在onActionExecute()中註釋closeSession(),則返回 。會話一直開放,如果刷新頁面,一切都會很好。 我查了很多,並嘗試了我認識的不同方式。它只發生在我第二次想用我的customMembership進行CRUD操作時。
對於其他實體,它的作用就像一個魅力! 我已經上傳了我的示例代碼。用於測試只需創建並清空數據庫並更改連接字符串。然後去到localhost:*****/API /類別(用戶,並通過不要求)
下載示例項目: 大小:47 MB https://www.dropbox.com/s/o63wjng5f799fii/Hashem-MVC4ServicesBook.rar
大小:54 MB Zip格式: https://www.dropbox.com/s/smrsbz4cbtznx1y/Hashem-MVC4ServicesBook2.zip
上傳的示例代碼。請檢查。 –