操作过滤器执行顺序

vto*_*ola 19 asp.net-mvc authorize-attribute action-filter asp.net-mvc-3

我创建了两个实现的类AuthorizeAttribute.

一个是全局使用的,我将它设置在Global.asax.cs上:

filters.Add(new FirstAuthorizeAttribute() { Order = 0 });
Run Code Online (Sandbox Code Playgroud)

另一个被调用SecondAuthorizeAttribute,它只在一些动作方法中使用,我在我想要的方法中使用它作为属性.

    [HttpGet]
    [SecondAuthorize]
    public ActionResult LogOut()
    {
        FormsAuthentication.SignOut();
        Session.Clear();
        Session.Abandon();
        return Redirect(Url.Content("~/"));
    }
Run Code Online (Sandbox Code Playgroud)

问题是SecondAuthorizeAttribute始终执行之前FirstAuthorizeAttribute,我需要先执行此操作.订单没有帮助,我怎么能这样做?

fre*_*n-m 20

@HectorCorrea的答案中的链接目前尚未解决,这是从当前Google缓存中检索和汇总的内容(如果也是这样):

过滤器按此顺序执行:

  • 授权过滤器
  • 动作过滤器
  • 响应/结果过滤器
  • 异常过滤器

在每个过滤器中,您可以指定Order属性.(所有过滤器都派生自抽象类FilterAttribute,并且此类具有Order属性).此属性将确保筛选器以特定订单运行.

例如:

[AuthorizationFilterA(Order=2)]
[AuthorizationFilterB(Order=1)]
public ActionResult Index()
{          
    return View();
}
Run Code Online (Sandbox Code Playgroud)

还有FilterScope,默认情况下,当订单相同(或未指定)时,具有最低范围的过滤器首先运行:

namespace System.Web.Mvc {
    public enum FilterScope {
        First = 0,
        Global = 10,
        Controller = 20,
        Action = 30,
        Last = 100,
    }
}
Run Code Online (Sandbox Code Playgroud)

如果未指定订单,则订单值为-1(首先,不是最后一个).

控制器本身可以是过滤器,并将按顺序运行 Int32.MinValue

  • 请记住,异常过滤器以相反的顺序运行(当然它们会这样做!),因此对于那些,具有最高范围的过滤器首先运行 (2认同)

Hec*_*rea 12

这是一个很长的镜头,但您是否尝试过使用FirstAuthorizeAttribute的Global和First值?

http://msdn.microsoft.com/en-us/library/system.web.mvc.filterscope(v=vs.98).aspx

http://blog.rajsoftware.com/post/2011/05/14/MVC3-Filter-Ordering.aspx

  • 请考虑将链接中的相关内容复制到答案中. (3认同)