Порядок выполнения фильтра действий - PullRequest
19 голосов
/ 25 октября 2011

Я создал два класса, которые реализуют 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 ]

20 голосов
/ 08 июня 2015

Ссылка в ответе @ 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

12 голосов
/ 25 октября 2011

Это длинный выстрел, но вы пытались использовать глобальные и первые значения для своего атрибута FirstAuthorizeAttribute?

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 голосов
/ 30 мая 2013

Заказ не работает в файле global.asax.cs.Если требование - заказ, тогда перейдите в Контроллер или Метод Действия и дайте.например: -

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

HomeController: Controller

или

публичный указатель ActionResult()

...