【问题标题】:Action filter execution order动作过滤器执行顺序
【发布时间】:2011-10-25 14:10:46
【问题描述】:

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

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

filters.Add(new FirstAuthorizeAttribute() { Order = 0 });

另一个叫SecondAuthorizeAttribute,只用在一些动作方法中,我把它作为属性用在我想要的方法中。

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

问题是SecondAuthorizeAttribute总是在FirstAuthorizeAttribute之前执行,我需要这个先执行。订单没有帮助,我该怎么办?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 action-filter authorize-attribute


    【解决方案1】:

    @HectorCorrea 答案中的链接目前已失效,这是从当前 Google 缓存中检索和汇总的内容(以防万一):

    过滤器按此顺序执行:

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

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

    例如:

    [AuthorizationFilterA(Order=2)]
    [AuthorizationFilterB(Order=1)]
    public ActionResult Index()
    {          
        return View();
    }
    

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

    namespace System.Web.Mvc {
        public enum FilterScope {
            First = 0,
            Global = 10,
            Controller = 20,
            Action = 30,
            Last = 100,
        }
    }
    

    如果没有指定顺序,则顺序值为-1(第一个,不是最后一个)。

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

    【讨论】:

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

    这是一个长镜头,但您是否尝试过为 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】:

    订单在 global.asax.cs 文件中不起作用。 如果要求是命令,则转到控制器或操作方法并给出。 例如:-

    [secondAttribute(order =1)] [firstAttribute(order=2)]

    HomeController:控制器

    public ActionResult Index()

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 2013-07-18
      • 2013-11-27
      • 2020-07-10
      • 2015-01-10
      • 1970-01-01
      • 2014-03-04
      • 2011-09-27
      相关资源
      最近更新 更多