我目前有2个过滤器,Auth和Redirect执行以下操作:Filter Auth,实现IAuthorizationFilter和ActionFilter,检查用户登录和授权,如果失败,则将filterContext.Result设置为403的HttpStatusCodeResult(禁止) )。实现IActionFilter和ActionFilter的Filter Redirect检查结果,如果是403,则重定向到登录页面。
我将它们应用于以下操作:
[Auth(Order=0)]
[Redirect(Order=1)]
然而,Auth被执行但Redirect永远不会被执行(不是它提供的4个可重写方法之一)。如果我删除了Auth Redirect执行,但如果我将Auth包含为第一个过滤器,则不执行重定向。我想设置过滤器上下文的Result属性可以防止任何其他过滤器被执行,但我无法实现这种情况发生的原因。仅供我使用ASP.NET MVC 3 beta,但这不应该改变任何内容。
更新:将Auth的过滤器类型更改为IActionFilter而不是IAuthorizationFilter会导致重定向中的OnResultExecuting和OnResultExecuted触发,但更改响应对于对浏览器的最终响应没有任何影响。
答案 0 :(得分:2)
我最终通过重定向IResultFilter并在OnResultExecuting中编写以下内容来修复它:
filterContext.HttpContext.Response.Redirect(url);
答案 1 :(得分:0)
当您设置HttpStatusCodeResult
时,您正在设置重定向,因此第二个过滤器将不会执行(因为您已经重定向)。