過濾器執行順序

- Authorization filters r最先運行,用於確定是否已針對請求為用戶授權。 如果請求未獲授權,授權篩選器可以讓管道短路。
- Resource filters:
- 授權后運行。
- OnResourceExecuting 在篩選器管道的其余階段之前運行代碼。 例如,
OnResourceExecuting
在模型綁定之前運行代碼。 - OnResourceExecuted 在管道的其余階段完成之后運行代碼。
- Action filters:
- 在調用操作方法之前和之后立即運行代碼。
- 可以更改傳遞到操作中的參數。
- 可以更改從操作返回的結果。
- 頁面 不 支持 Razor 。
- Exception filters 在向響應正文寫入任何內容之前,對未經處理的異常應用全局策略。
- Result filters 在執行操作結果之前和之后立即運行代碼。 僅當操作方法成功執行時,它們才會運行。 對於必須圍繞視圖或格式化程序的執行的邏輯,它們很有用。

同步和異步
當要創建過濾器時,應該實現 IXXXFilter 或 IAsyncXXXFilter,這兩個接口的區別是前者同步、后者異步。ASP.NET Core MVC 會首先檢查異步實現,如果沒有實現異步方式,則繼續檢查同步實現,因此在創建過濾器時,不需要同步接口和異步接口都實現。
public interface IAsyncActionFilter : IFilterMetadata
{
Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
}
public interface IActionFilter : IFilterMetadata
{
void OnActionExecuted(ActionExecutedContext context);
void OnActionExecuting(ActionExecutingContext context);
}
public class CustomActionFilter : IActionFilter,IAsyncActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// Action執行之前
}
public void OnActionExecuted(ActionExecutedContext context)
{
//Action執行之后
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
// Action執行之前
await next();
// Action執行之后
}
}
OnActionExecutionAsync
方法,該方法的第二個參數ActionExecutionDelegate
表示要執行的 Action
,它是一個委托類型,因此在這個方法的內部可以直接調用 next()
,並在 next()
前后執行相應的代碼。
篩選器作用域和執行順序
可以將篩選器添加到管道中的以下三個 范圍 之一:
- 在控制器操作上使用屬性。 篩選器屬性不能應用於 Razor 頁面處理程序方法。
- 在控制器或頁上使用特性 Razor 。
- 針對所有控制器、操作和頁面全局 Razor 顯示,如以下代碼所示:
public void ConfigureServices(IServiceCollection services)
{
//2.1 services.AddMvc(...)
services.AddControllersWithViews(options =>
{
options.Filters.Add(typeof(MySampleActionFilter));
});
}