【Web API】ActionFilter的執行順序

/
0 Comments
在寫WebAPI多少都需要寫一些客製化的ActionFilter,在沒弄清ActionFilter的執行順序時很可能會出現意想不到的錯誤。


ActionFilter的執行順序是和 FilterScope 類別有關 :
FilterScope
定義用來指定在相同的篩選類型和篩選順序中篩選執行順序的值。


ActionFilter的預設執行順序是依照放在Global、Controller、Action的順序來執行的,具有不同Scope的Filter的排序順序是明確的,那當多個ActionFilter在同一個Scope呢? 答案是不確定的,通常來說,你就算不設定執行順序,多個ActionFilter也會正常,但因為沒設定執行順序偶而就會出錯,這就會造成問題,想解決此問題就需要設定他們的執行順序。
PS: Action中AuthorizationFilters的執行順序又在ActionFilters之前。

下面提供一個簡單的實際測試來證明這些Attribute確實是一次順序在執行的 :
  • 先建立一個Web API專案並新增4個ActionFilter(都繼承ActionFilterAttribute)如下圖


  • 接著新增1個AuthorizationFilter(繼承AuthorizationFilterAttribute)如下圖


  • 最後應該總共有5個Attributes


  • 分別在Global、Controller及Action加上Attributes






取得結果 :
[
{
"m_Item1":"MyGlobalAttribute",
"m_Item2":"Global"
},
{
"m_Item1":"MyControllerAttribute",
"m_Item2":"Controller"
},
{
"m_Item1":"MyAuthorizeAttribute",
"m_Item2":"Action"
},
{
"m_Item1":"MyAction2Attribute",
"m_Item2":"Action"
},
{
"m_Item1":"MyAction1Attribute",
"m_Item2":"Action"
}
]


從結果可以清楚看出執行的順序並非依照程式碼逐行執行的,前面標示出的執行順序是固定的,而最後兩個Action的執行順序是不固定的,在下一篇會來解決的問題。




You may also like

沒有留言: