操作过滤器执行顺序

时间:2011-10-25 14:10:47

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

我创建了两个实现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之前执行,我需要先执行此操作。订单没有帮助,我怎么能这样做?

3 个答案:

答案 0 :(得分:19)

目前,@ 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

运行

答案 1 :(得分: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

答案 2 :(得分:3)

订单在global.asax.cs文件中不起作用。 如果需求是订单,则转到Controller或Action Method并给出。 例如: -

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

的HomeController:控制器

公共ActionResult索引()