2012-10-31 76 views
0

我在ASP .NET Web窗體應用程序中使用會話每請求方法。會話已在ASP .NET會話每請求模式中關閉

這是當請求結束運行的代碼,這是我怎麼關閉會話:

protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     ISession session = ManagedWebSessionContext.Unbind(HttpContext.Current, SessionFactoryProvider.SessionFactory); 

     if (session != null) 
     { 
      if (session.Transaction != null && session.Transaction.IsActive) 
      { 
       session.Transaction.Rollback(); 
      } 
      if (session.IsOpen) 
      { 
       session.Close();  
      } 
     } 
    } 

很明顯的東西。但是,我在撥打時段時不斷得到例外。關閉。唯一的例外是型SessionException和消息是:

{ 「會話已經關閉」}

堆棧跟蹤爲:

at NHibernate.Impl.SessionImpl.Close() in d:\CSharp\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 343 

NHibernate的我的版本使用的是:3.0.0.4000

我已經se拱起代碼,可能會關閉會議,但沒有找到任何。我也用簡單的請求測試了它,它對session對象什麼都不做,而且還是一樣的。任何想法可能是什麼問題?

編輯:分而治之會議結束後,我已經有針對性的一段代碼,負責該異常

    var session = SessionFactoryProvider.GetCurrentSession(); 
        using (ITransaction tx = session.BeginTransaction()) 
        { 
         session.Update(instrument); 
         tx.Commit(); 
        } 

如果我把它註釋掉會議在EndRequest處理程序,並順利關閉無會話已關閉異常被拋出。

+0

的是的Isession的IDisposable,所以你應該更喜歡調用Dispose()就可以了吧。這個版本的NH真的很老,它也是NH 3系列中的第一個,所以也許你應該嘗試升級。 –

+0

謝謝。我使用了Dispose,但仍然如此。我發現的是,明確的交易導致了這個問題。我會更新這個問題。 – dragonfly

+0

這很奇怪......爲了最好的兼容性,事務總是應該是「明確的」,所以這個故事必須有更多。 –

回答

1

我們使用IHttpModule,這種方式:

public class ModuleSessionNHibernate : IHttpModule 
{ 
     public void Init(HttpApplication context) 
     { 
      context.BeginRequest += new EventHandler(BeginTransaction); 
      context.EndRequest += new EventHandler(CommitAndCloseSession); 
     } 

     private void CommitAndCloseSession(object sender, EventArgs e) 
     { 
      // commit or rollback depending on errors 
      // then close session 
     } 

     ... 
} 

而且在web.config中

<httpModules> 
    <add name="NHibernateSessionModule" type="XXX.ModuleSessionNHibernate, XXX"/> 
</httpModules> 

編輯:關於提交和關閉會話(但我們使用了很多助手和服務...)

private void CommitAndCloseSession(object sender, EventArgs e) 
    { 
     try 
     { 
      if (no exception in context) 
      { 
       // commit transaction 
      } 
      else 
      { 
       // rollback transaction 
      } 
     } 
     finally 
     { 
      try 
      { 
       // close session 
      } 
      catch (Exception ex) 
      { 
       // send email      
      } 

       // rollback 
       // close 

       throw; 
      } 
     } 
    } 
+0

那麼,但BeginTransaction/CommitAndCloseSession的外觀如何?基本上這是有趣的部分。無論你使用全球.asax或IHttpModule只是一個方法和問題分離的問題 - 當然你的方法是更好:) – dragonfly

+0

我更新了我的帖子,但因爲我們使用了很多幫手和東西,它可能不是很對你有幫助。我認爲在sessionNhibernate的大部分交易背後。 –