.NET Core 過濾器詳解

在 .NET Core 中,過濾器是一種很重要的機制,它可以在請求管道的不同階段中加入代碼,對請求進行處理以及做出響應。 該過濾器是用於解決攔截,驗證,記錄日誌,緩存和處理異常等問題。

一、過濾器的分類

1.1 Authorization Filter

授權過濾器可以幫助你控制哪個用戶可以訪問你的應用程序,並在滿足某些條件時將用戶轉到指定的授權頁面。一個授權過濾器是系統中第一個運行的過濾器。


public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
  public void OnAuthorization(AuthorizationFilterContext context)
  {
      var hasAccess = CheckAccess(context.HttpContext.User.Identity.Name);
      if (!hasAccess)
      {
          context.Result = new RedirectToRouteResult(
            new RouteValueDictionary(
              new { controller = "Home", action = "AccessDenied" }));
      }
  }
}

1.2 Action Filter

Action Filter 是過濾器中最常用的類型之一。它可以在 Action 執行前後處理請求,對請求進行攔截,在路由和模型綁定之後、執行 Action 之前和之後執行代碼。


public class CustomActionFilterAttribute : Attribute, IActionFilter
{
  public void OnActionExecuting(ActionExecutingContext filterContext)
  {
      // logic before action executes
  }

  public void OnActionExecuted(ActionExecutedContext filterContext)
  {
      // logic after action executes
  }
}

1.3 Exception Filter

異常過濾器用於捕獲和處理應用程序中拋出的異常。如果未處理異常,則應用程序將終止。異常過濾器可以在異常處理程序之前攔截異常。


public class CustomExceptionFilterAttribute : Attribute, IExceptionFilter
{
  public void OnException(ExceptionContext context)
  {
      // Log the exception
      // Send error information to stakeholders
  }
}

1.4 Result Filter

結果過濾器處理在執行 Action 後生成的結果,例如,它可以修改從 Action 返回的視圖結果或在返回結果之前記錄一些信息。


public class CustomResultFilterAttribute : Attribute, IResultFilter
{
  public void OnResultExecuting(ResultExecutingContext context)
  {
      // logic before result executes
  }

  public void OnResultExecuted(ResultExecutedContext context)
  {
      // logic after result executes
  }
}

二、過濾器的應用

2.1 過濾器的順序執行

在 ASP.NET Core 應用程序中,過濾器的執行順序非常重要。如果多個過濾器存在,它們將按照預定義的順序應用。 ASP.NET Core 中的過濾器共有3個順序:

  • Authorization Filter
  • Resource Filter
  • Action/Result Filter

2.2 全局過濾器

全局過濾器是在應用程序的全局範圍內應用的過濾器。 它們在 Startup.cs 文件中設置,並在應用程序啟動時配置。 當您需要在應用程序的所有請求和響應之間共享任何數據時,全局過濾器非常有用。


services.AddMvc(config =>
{
    config.Filters.Add(new CustomActionFilterAttribute());
    config.Filters.Add(new CustomResultFilterAttribute());
});

上面的示例演示了如何在全局註冊自定義 Action Filter 和 Result Filter。

三、過濾器的擴展

3.1 自定義參數

過濾器參數可以讓您輕鬆自定義和創建自己的過濾器。 您可以在過濾器參數中傳遞自定義信息以執行請求處理操作。


public class SampleFilterAttribute : Attribute, IResourceFilter
{
    private readonly string _parameter;

    public SampleFilterAttribute(string parameter)
    {
        _parameter = parameter;
    }

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        // Perform logic after execution of action
    }

    public void OnResourceExecuting(ResourceExecutingContext context)
    {
        // Perform logic before execution of action

        if (_parameter == "test")
        {
            // perform operation
        }
    }
}

3.2 過濾器依賴注入

在自定義過濾器中使用依賴注入是非常常見的組件框架實踐。 在 ASP.NET Core 中,您可以使用依賴注入容器將依賴項注入到過濾器中。


public interface ICustomService
{
    string GetOperationResult();
}

public class CustomService : ICustomService
{
    public string GetOperationResult()
    {
        return "Service operation completed.";
    }
}

public class SampleFilter : IAuthorizationFilter
{
    private readonly ICustomService _customService;

    public SampleFilter(ICustomService customService)
    {
        _customService = customService;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var result = _customService.GetOperationResult();
        // Perform custom authorization logic based on custom service
    }
}

四、總結

.NET Core 過濾器是一個強大的工具,可以對 ASP.NET Core 應用程序進行授權、驗證、異常處理、日誌記錄和緩存處理等。本文對過濾器的四種類型進行了介紹,包括 Authorization Filter、Action Filter、Exception Filter 和 Result Filter。同時也介紹了過濾器的應用、擴展以及依賴注入的相關知識。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/158555.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-19 00:42
下一篇 2024-11-19 18:50

相關推薦

  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論