2013-05-30 27 views
1

我有一個展示會話管理問題的ASP.NET MVC 4應用程序。爲什麼在ASP.NET MVC中使用異步操作和RedirectToAction時會獲得新會話?

我正在使用會話來跟蹤登錄的用戶。我有一個自定義操作篩選器,用於檢查用戶是否已登錄,如果沒有,則重定向到登錄頁面。

一般工作正常。但是,我遇到了在某個請求期間創建新會話的問題。會話ID是相同的,但Session.IsNewSession屬性顯示它是一個新會話 - 會話內容已經消失。

發生的動作是異步動作(使用.NET 4.5中的異步/等待功能)。我不要在使用await關鍵字調用的線程中操作會話。等待操作完成後,我會執行RedirectToAction來顯示操作的結果。

當我檢查會話時,就在執行動作之前,我已將其重定向到它具有自定義訪問屬性 - 這是當我發現一個新會話已創建(所以身份驗證失敗,我是返回到登錄頁面)。

我在應用程序中的許多點使用RedirectToAction,所以不能是問題(或至少只有問題)。問題可能與異步/等待調用有關 - 即使我不使用或需要由await調用的代碼內的會話嗎?

是否將ASP.NET線程返回到池並重新使會話失效?如果是這樣,解決方案是什麼?我可以在整個等待期間保存和恢復會話嗎?或者我將不得不實現一些自定義邏輯,記錄用戶登錄到我的數據庫中,例如?

+1

服務器端代碼中的異步?這是不好的情況。 –

+1

'async'不應該導致會話問題。你是否使用'ConfigureAwait(false)'?你可以發佈一個最小的repro? –

+0

檢查http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4 – Gerard

回答

1

原來,這個問題是由我使用的Win32 DLL引起的,這是一個配置文件「觸摸」(即更改時間戳)。這導致Web應用程序在那個時候被重新加載 - 從而使會話無效。

相關問題