2010-01-19 41 views
2

在使用自定義依賴注入容器(在本例中爲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.ProcessRequestMvcHandler.ProcessRequest左右的某個地方發生..肯定在調用DefaultControllerFactory.CreateController之前。

有沒有其他人必須處理這種情況?

更新:說實話,我覺得這個方法可能不正確和更好的主意是處理窗體身份驗證超時在客戶端與母版頁上的一些JavaScript。然後,我可以重定向到將清除會話並將其返回到登錄頁面的操作,類似於what is described here

回答

0

你可以寫一個封裝統一控制器工廠的控制器工廠(參見我的帖子,委託裝飾器http://haacked.com/archive/2008/06/18/delegating-decorators.aspx爲例)。

然後在您的控制器工廠中,您可以重寫GetControllerInstance並將代理的調用與您的前後代碼一起包裝到GetControllerInstance中。

這有道理嗎?

+0

嗯..所以我已經有一個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

+0

哦 - 我想我打包GetControllerInstance時,我可以檢查!HttpContext.Current.Request.IsAuthenticated,然後返回我的HomeController以及更改requestContext.RouteData.Values [「動作」]任何我喜歡:) – Jedidja 2010-01-20 12:43:11

+0

是的,儘管你不必經過HttpContext.Current。 GetControllerInstance接收一個RequestContext。所以我想要做的是: requestContext.HttpContext.Request.IsAuthenticated 這樣可以更容易地單元測試你的新控制器工廠。 – Haacked 2010-01-20 16:50:19

相關問題