Asp.net-Mvc

動作過濾器執行順序

  • October 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,我需要先執行這個。訂單沒有幫助,我該怎麼辦?

這是一個很長的鏡頭,但是您是否嘗試過為 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>

@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

引用自:https://stackoverflow.com/questions/7890610