在调用GetControllerInstance之前,是否可以拦截ProcessRequest以确定表单超时?

时间:2010-01-19 13:25:53

标签: asp.net-mvc timeout forms-authentication

在ASP.NET MVC应用程序中使用自定义依赖注入容器(在本例中为Unity)时,是否可以在调用GetControllerInstance之前拦截请求以确定是否已发生表单身份验证超时?< / p>

我在web.config中有以下内容:

<authentication mode="Forms">
  <forms loginUrl="~/Home/Index" timeout="10" defaultUrl="~/Home/Index"/>
</authentication>

如果我登录网站,等待超时发生,然后访问另一个页面(好吧,控制器操作),我原本希望框架能够自动将我重定向到~/Home/Index。相反,它很乐意尝试创建新的控制器来处理失败的请求,最后我被重定向到我们的自定义错误页面。

查看callstack,我认为这需要在MvcHandler.System.Web.IHttpHandler.ProcessRequestMvcHandler.ProcessRequest附近发生..当然在调用DefaultControllerFactory.CreateController之前。

有没有其他人必须处理这种情况?

更新:说实话,我认为这种方法可能不正确,更好的办法是在主页上使用一些javascript在客户端处理表单身份验证超时。然后,我可以重定向到一个清除会话并将其返回到类似于what is described here的登录页面的操作。

1 个答案:

答案 0 :(得分:0)

您可以编写一个包含统一控制器工厂的控制器工厂(有关示例,请参阅我的委托装饰器http://haacked.com/archive/2008/06/18/delegating-decorators.aspx的帖子)。

然后在您的控制器工厂中,您可以覆盖GetControllerInstance并使用您的前后代码将委托的调用包装到GetControllerInstance。

这有意义吗?