2011-11-18 38 views
0

我有一個MVC2 web應用程序,其中我剛剛實現了一些會話超時代碼。在Global.asax中,我添加了一個Session_End處理程序,該處理程序檢查記錄是否打開進行編輯,如果是,則向外部系統發出Web服務調用以回滾存儲庫中的記錄,以便它不鎖定在「用於編輯'狀態。記錄仍然顯示在用戶的瀏覽器中,因爲我們無法將消息推送到瀏覽器來關閉記錄。當用戶接下來與(現在超時)頁面交互時,例如,要刷新,取消,保存或提交,Web應用程序會看到用戶未登錄(會話已過期,因此登錄名隨之一起),然後重定向到登錄頁面。如何從Global.asax獲取數據到MVC視圖

在登錄頁面上,我想顯示一條消息,解釋用戶重定向的原因,如下所示:「您的會話超時;請重新登錄;如果您有記錄打開,則會恢復到先前的狀態狀態。」

問題:Global.asax,我可以在哪裏存儲消息,以便登錄控制器或視圖可以在我們重定向時找到它?我似乎無法在Global.asax中獲得對ViewData的參考。當我引用它想:

System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData["ErrorMessage"] = "Your session timed out..." 

我得到一個錯誤:

An object reference is required for the non-static field, method, or property 'System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData.get' 

就是我試圖可能的,我只是不知道引用ViewData正確的方式,或者是ViewData無法訪問Global.asax?在這種情況下,將Global.asax的消息設置爲在視圖中顯示的最佳選擇是什麼?

+0

它爲什麼需要在Global.asax中? – SLaks

+0

我不認爲你的解決方案是可能的。您如何知道某條消息是針對特定用戶的?由於它們沒有有效的會話,它們是不是被FormsAuthentication重定向到登錄頁面? – Dallas

+0

@SLaks,AFAIK Session_End處理程序需要在Global.asax中,因爲它是由單獨的工作進程觸發的,而不是我的主應用程序的進程,所以我無法在我的應用程序類中捕獲它。我錯了嗎? – Val

回答

3

@Val - 首先,你不應該這樣做認證。您應該使用管道和FormsAuthentication或類似的。這可能會產生可被攻擊者或惡意軟件機器人利用的安全漏洞。其次,不能保證Session_End會觸發,所以記錄可以無限期地鎖定。例如,如果工作進程被回收,則Session_End將永遠不會被調用,所以您不能依賴此機制來解鎖資源。

我建議你重新考慮你的設計,不要以這種方式鎖定記錄進行編輯,也不要依賴session_end來處理任何重要的事情。

+0

對不起,我的評論不清楚。我們確實擁有Forms Auth loginUrl,但我們也爲用戶簽入控制器,因此始終優先;到目前爲止,我還沒有看到管道做重定向。您關於Session_End不可靠的觀點很好。這並不意味着是一個防彈功能,但是當用戶將記錄保留在夜間進行編輯時,會減少記錄鎖定的問題。改變我們的記錄鎖定語義可能是我們明年重寫MVC3(4?)的一種選擇,但目前還沒有。 – Val

+0

@Val - Forms Auth將優先於您在頁面中執行的任何操作,因爲如果FormsAuth Cookie過期,頁面中的代碼將永遠不會執行。如果您手動重定向用戶,那麼只需添加一個查詢字符串,表明它來自會話超時。也就是說,在你做重定向的頁面中(我假設你正在檢查一個有效的會話,如果沒有重定向),用一條消息向你的登錄頁面發送一個參數。 –

+0

@MM,不知道這是否會工作。我的頁面已打開,但會話超時。我點擊一個鏈接GET或POST到控制器。控制器檢查會話,發現它是無效的,並重定向到登錄。我沒有看到我的控制器如何知道記錄的狀態 - 它需要提前知道用戶打開編輯,才能傳遞正確的錯誤信息。 – Val

相關問題