asp.net mvc动作过滤器中http重定向的无限循环

时间:2013-07-31 05:47:37

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing action-filter

我使用asp.net mvc 3开发Web应用程序。 我编写了自定义全局Action过滤器,每当我调用mvc站点中的任何页面时都会触发它。

在该过滤器中,我正在检查某些条件,如果满足这些条件,我将用户重定向到“不可用”页面。它在所有情况下都能正常工作。

它不能用于Home / Index,这是我的默认路由。当我第一次启动应用程序时,我可以在fiddler中看到Home / Index,状态代码为302(重定向到application / unavailable)。 浏览器然后尝试重定向到应用程序/不可用页面。令我惊讶的是,我可以从这个页面再次看到主页/索引中的302提琴手。这一直持续到一段时间,然后我在Firefox中低于错误

“Firefox检测到服务器正在以永远无法完成的方式重定向此地址的请求。”

我可以看到fiddler中有302的无限循环。但我不知道为什么会这样。我在路由方面做错了吗?

我的代码适用于网站的其他页面。

这是我的代码:

routes.MapRoute("Application", "Application/Unavailable", MVC.Application.Unavailable());
routes.MapRoute("Home", "Home/{action}", new {controller = "Home"}, new[] {"Test.Web.Controllers"});
routes.MapRoute("Default", "{controller}/{action}", MVC.Home.Index(), new[] {"Test.Web.Controllers"});



 public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
...
  if (conditionmet)
                {
                    RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
                    redirectTargetDictionary.Add("area", "");
                    redirectTargetDictionary.Add("action", "Unavailable");
                    redirectTargetDictionary.Add("controller", "Application");
                    filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
                }
}

1 个答案:

答案 0 :(得分:2)

我设法解决了这个问题。我在MVC网站中使用表单身份验证。 登录URL配置为Home / Index。因此,当用户从主页/索引重定向到应用程序/不可用时,它将再次重定向到默认页面,因为用户未经身份验证。

然后我在web.config中添加了位置条目,用于从身份验证中排除“应用程序/不可用”页面。

<location path="Application/Unavailable">
        <system.web>
            <authorization>
                <allow users="*" />
            </authorization>
        </system.web>
    </location>

现在我的代码在Home / Index页面上运行得非常好。