【问题标题】:Application_EndRequest Doesn't Fire on a 404Application_EndRequest 不会在 404 上触发
【发布时间】:2010-07-06 23:07:34
【问题描述】:

我正在使用 ASP MVC 2 和 Nhibernate。我创建了一个 HTTP 模块,如 NHibernate 13 的夏季所示,如下所示:

public void Init(HttpApplication context)
{
     context.PreRequestHandlerExecute += new EventHandler(Application_BeginRequest);
     context.PostRequestHandlerExecute += new EventHandler(Application_EndRequest);
}

private void Application_BeginRequest(object sender, EventArgs e)
{

    ISession session = StaticSessionManager.OpenSession();
    session.BeginTransaction();
    CurrentSessionContext.Bind(session);
}

private void Application_EndRequest(object sender, EventArgs e)
{
  ISession session = CurrentSessionContext.Unbind(StaticSessionManager.SessionFactory);
  if (session != null)
  try
  {
      session.Transaction.Commit();
   }
   catch (Exception)
   {
       session.Transaction.Rollback();
   }
   finally
   {
       session.Flush();
       session.Close();
    }
}

web.config

<add name="UnitOfWork" type="HttpModules.UnitOfWork"/>

我的问题是 Application_EndRequest 永远不会因为 404 错误而被调用,所以如果我的视图没有呈现,我会完全阻止数据库访问,直到我的刷新发生。我对 NHibernate 还很陌生,所以我不确定我是否遗漏了什么。

【问题讨论】:

  • 我很好奇为什么 Application_EndRequest 不会在 404 上被调用。也许这仅适用于特定的子状态代码。例如,对于 404.13(请求太大),调用 Application_EndRequest。事实上,它被 而不是 Application_BeginRequest 调用,并且几乎是立即调用,早在服务器可能接收到整个请求之前。

标签: c# nhibernate session


【解决方案1】:

您可以在 application_error 中处理和回滚会话。将 session.close 更改为 session.dispose 并检查它是否尚未释放。

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多