2010-06-16 55 views
12

我有一個水龍頭到BeginRequestEndRequest應用程序設置和拆除這樣的NHibernate會話:「需要SSL」如何影響ASP.NET MVC應用程序生命週期?

BeginRequest += delegate 
{ 
    CurrentSessionContext.Bind(SessionFactory.OpenSession()); 
}; 

EndRequest += delegate 
{ 
    var session = CurrentSessionContext.Unbind(SessionFactory); 
    session.Dispose(); 

    Container.Release(session); 
}; 

部署在IIS時,直到我選中「要求SSL」框也能正常工作。一旦我這樣做,我得到NullReferenceExceptionsession.Dispose()

我還沒有調試過這個問題,是的,修復是微不足道的,但我只是好奇「需要SSL」如何影響請求的生命週期。在這些情況下,服務器上沒有設置會話嗎?

編輯:爲了澄清,我指的是應用程序的IIS配置中的「Require SSL」選項,而不是控制器的RequireHttps屬性。

+0

您是否最初使用Http來瀏覽應用程序,然後告訴您使用Https?或者...您是否使用Https直接瀏覽應用程序? – Jason 2010-10-01 14:51:29

+1

我正在與Http連接。我希望IIS能夠在不調用任何代碼的情況下立即響應重定向。 – Ragesh 2010-10-01 17:44:38

回答

5

這一個引起了我的好奇心,所以我挖了一點;爲死靈而感到遺憾。

我創建了一個簡單的項目,爲應用程序對象上的每個生命週期事件連接通知,並在每個事件上設置斷點。

事實證明,當「需要SSL」設置並且您沒有使用SSL訪問時,大部分事件都會被完全跳過。第一個觸發事件是LogRequest,然後是PostLogRequest,EndRequestPreSendRequestContentPreSendRequestHeaders(按該順序)。沒有其他事件被解僱。

所以你的代碼崩潰了,因爲BeginRequest事件從未被解僱,EndRequest委託人嘗試了Dispose()從未創建過的東西。

我最感興趣的是搞清楚爲什麼 IIS的行爲如此。我懷疑原因是即使請求的資源需要SSL,IIS仍然需要記錄無效的連接嘗試,以及發送內容和標題。畢竟,某些東西必須產生友好的「禁止」頁面。我不知道的是,爲什麼EndRequest在他們沒有打電話BeginRequest的時候被調用;我猜測有一些IIS/ASP清理代碼依賴於它。

此行爲因應用程序池是以「集成」還是「經典」模式運行而異。在「經典」模式下,ASP.NET事件全部觸發IIS PreRequestHandlerExecutePostRequestHandlerExecute事件之間。你沒有說你正在運行哪個,但它必須是集成的;否則你會看到你期待的行爲,即你的代碼根本沒有被執行。有趣的是,如果您在Classic模式下嘗試訂閱LogRequestPostLogRequestMapRequestHandler事件,則會得到運行時異常;這些僅在整合管道的情況下「有意義」。

+0

很好的回答!感謝您花時間研究這一點。 – Ragesh 2011-03-14 04:52:58