asp,net core 3.1 的過濾器(篩選器)


過濾器執行順序

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

同步和異步

當要創建過濾器時,應該實現 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));
    });
}

擴展:ASP.NET Core 中的篩選器 asp.net core 3.1

擴展:MVC - 16.MVC過濾器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM