在使用自定義依賴注入容器(在本例中爲Unity)的ASP.NET MVC應用程序中,是否可以在調用GetControllerInstance
以確定是否發生表單驗證超時之前攔截請求?在調用GetControllerInstance之前是否可以攔截ProcessRequest來確定表單超時?
我已經中web.config
如下:
<authentication mode="Forms">
<forms loginUrl="~/Home/Index" timeout="10" defaultUrl="~/Home/Index"/>
</authentication>
如果我登錄到網站上,等待出現超時,然後訪問另一個頁面(當然,控制器動作),我本來期望的框架負責自動將我重定向到~/Home/Index
。相反,它愉快地沿着嘗試創建新的控制器來處理失敗的請求,並最終被重定向到我們的自定義錯誤頁面。
看着這個調用堆棧,我認爲這需要在MvcHandler.System.Web.IHttpHandler.ProcessRequest
或MvcHandler.ProcessRequest
左右的某個地方發生..肯定在調用DefaultControllerFactory.CreateController
之前。
有沒有其他人必須處理這種情況?
更新:說實話,我覺得這個方法可能不正確和更好的主意是處理窗體身份驗證超時在客戶端與母版頁上的一些JavaScript。然後,我可以重定向到將清除會話並將其返回到登錄頁面的操作,類似於what is described here。
嗯..所以我已經有一個UnityControllerFactory寫(http://stackoverflow.com/questions/2072121/in-asp-net-mvc2-using-unity-does-my-program-need-to-manage的最 - 共-the-壽命/ 2072214#2072214)。當我用另一個控制器工廠進行封裝時,如果會話超時,如何將此包裝的GetControllerInstance重定向到〜/ Home/Index?我想我不得不返回一個IController(或null)? – Jedidja 2010-01-19 20:04:34
哦 - 我想我打包GetControllerInstance時,我可以檢查!HttpContext.Current.Request.IsAuthenticated,然後返回我的HomeController以及更改requestContext.RouteData.Values [「動作」]任何我喜歡:) – Jedidja 2010-01-20 12:43:11
是的,儘管你不必經過HttpContext.Current。 GetControllerInstance接收一個RequestContext。所以我想要做的是: requestContext.HttpContext.Request.IsAuthenticated 這樣可以更容易地單元測試你的新控制器工廠。 – Haacked 2010-01-20 16:50:19