ASP.NET MVC操作过滤器:在过滤器中设置filterContext.Result可防止其他过滤器被执行?

时间:2010-10-29 23:31:18

标签: asp.net-mvc action-filter actionfilterattribute

我目前有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触发,但更改响应对于对浏览器的最终响应没有任何影响。

2 个答案:

答案 0 :(得分:2)

我最终通过重定向IResultFilter并在OnResultExecuting中编写以下内容来修复它:

filterContext.HttpContext.Response.Redirect(url);

答案 1 :(得分:0)

当您设置HttpStatusCodeResult时,您正在设置重定向,因此第二个过滤器将不会执行(因为您已经重定向)。