2010-01-19 40 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

相关问题