入門から習得までの ASP.NET Core MVC フィルター

テクノロジーの発展に伴い、ASP.NET Core MVC もリリースされてから長い時間が経ちます。継続的なバージョン更新の繰り返しを経て、ますます完成度が高まっています。このシリーズの記事では、主に ASP.NET Core MVC 開発 B/S システムのプロセスに関連する内容について説明しています。ASP.NET Core MVC システム開発に従事したい初心者、学校卒業生、その他の担当者に適しています。

经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及命名约定,创建控制器,视图,模型,接收参数,传递数据ViewData,ViewBag,路由,页面布局,wwwroot和客户端库,Razor语法,EnityFrameworkCore与数据库,HttpContext,Request,Response,Session,序列化,文件上传,自动映射,Html辅助标签,模型校验,鉴权、授权基础,Identity入门,日志管理等内容,今天继续讲解ASP.NET Core MVC 中Filter(筛选器)等相关内容,仅供学习分享使用。

フィルターとは何ですか?

フィルターはフィルター、フィルターとも呼ばれます。ASP.NET Core MVC プロジェクトでは、フィルターを使用して、要求処理パイプラインの特定のポイントの前後でコードを実行できます。AOP アスペクト指向プログラミングと同様に、横断的な問題を処理するカスタム フィルターを作成できます。フィルタの作成では、エラー処理例外フィルタにエラー処理を組み込むなど、コードの重複を減らすことができます。

フィルターの動作原理

リクエストの開始からリクエストの終了まで、一連のノードを介して呼び出しパイプラインが形成されます。フィルターは ASP.NET Core MVC の呼び出しパイプラインで実行され、フィルターは特定のコードを実行するためにパイプラインに設定されたいくつかのフックに相当します。

フィルターの種類

さまざまな処理機能に応じて、フィルターは主に次のカテゴリに分類されます。

  • 認可フィルター AuthorizationFilter:

    • まず走ってください。
    • ユーザーがリクエストを許可されているかどうかを確認します。
    • リクエストが承認されていない場合、パイプラインがショートする可能性があります。
  • リソース フィルター リソース フィルター:

    • 承認後に実行します。
    • OnResourceExecuting は、フィルター パイプラインの残りの部分の前にコードを実行します。たとえば、OnResourceExecuting モデル バインディングの前にコードを実行します。
    • OnResourceExecuted は、残りのパイプラインが完了した後にコードを実行します。
  • アクション フィルター アクション フィルター:

    • アクション メソッドが呼び出される直前と直後に実行されます。
    • アクションに渡されるパラメータは変更できます。
    • 操作から返される結果は変更できます。
    • Razor ページでは利用できません。
  • 例外フィルター: 応答本文に何かを書き込む前に、未処理の例外にグローバル ポリシーを適用します。

  • 結果フィルター 結果フィルター:

    • アクションの結果の直前と直後に実行されます。
    • アクション メソッドが正常に実行された場合にのみ実行されます。
    • ビューまたはフォーマッタの実行をラップアラウンドする必要があるロジックに役立ちます。

 次の図は、フィルター パイプライン内でフィルター タイプがどのように相互作用するかを示しています。

フィルターの実装

すべてのフィルターは IFilterMetadata インターフェイスを実装します。さまざまなビジネス タイプに応じて、次の 5 種類のフィルターに対応する 5 つのインターフェイスが派生します。

注: 上記の 5 つのインターフェイスには、対応する非同期インターフェイス (Async) もあります。

フィルター範囲

フィルターはコントローラー、アクション、およびグローバルに作用できます。次の例は、同期操作フィルターのフィルター メソッドが実行される順序を示しています。

認可フィルター

認可フィルター:

  • フィルター パイプラインで実行される最初のフィルターです。
  • アクションメソッドへのアクセスを制御します。
  • その前に実行されるメソッドはありますが、その後に実行されるメソッドはありません。

たとえば、一般的に使用される RequireHttps は、IAuthorizationFilter インターフェイスを実装し、Attirbute を継承する承認フィルターであるため、コントローラーまたはアクションで使用できます。リクエストを制限する方法で。

using Microsoft.AspNetCore.Mvc.Filters;
using System;

namespace Microsoft.AspNetCore.Mvc
{
    //
    // 摘要:
    //     An authorization filter that confirms requests are received over HTTPS.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class RequireHttpsAttribute : Attribute, IAuthorizationFilter, IFilterMetadata, IOrderedFilter
    {
        public RequireHttpsAttribute();

        public int Order { get; set; }

        public virtual void OnAuthorization(AuthorizationFilterContext filterContext);

        protected virtual void HandleNonHttpsRequest(AuthorizationFilterContext filterContext);
    }
}

リソースフィルター

リソース フィルターは承認フィルターの後に実行され、IResourceFilter インターフェイスを実装する必要があります。次のように:

using Microsoft.AspNetCore.Mvc.Filters;

namespace DemoCoreMVC.Filter
{
    /// <summary>
    /// 同步版本
    /// </summary>
    public class LogResourceFilter :Attribute, IResourceFilter
    {
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            //Action执行完成后执行
            Console.WriteLine("********************On Resource Filter Executed********************");
        }

        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            //授权Filter执行后执行。
            Console.WriteLine("********************On Resource Filter Executing********************");
        }
    }

    /// <summary>
    /// 异步版本
    /// </summary>
    public class AsynLogResouceFilter : Attribute, IAsyncResourceFilter
    {
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            Console.WriteLine("********************On Aysnc Resource Filter Executing********************");
            var exceutedContext =  await next();
            Console.WriteLine("********************On Async Resource Filter Executed********************");
        }
    }
}

リソース フィルターは、パイプラインの大部分を短絡させたい場合に役立ちます。たとえば、キャッシュ ヒットがある場合、キャッシュ フィルターはパイプラインの残りの部分をバイパスできます。

オペレーションフィルター

アクション フィルターは Razor ページには適用されません。Razor Pages は IPageFilter と IAsyncPageFilter をサポートしています。

アクションフィルター:

  • IActionFilter または IAsyncActionFilter インターフェイスを実装します。
  • それらの実行は、アクション メソッドの実行を中心に展開します。

次のコードは、アクション フィルターのサンプルを示しています。

using Microsoft.AspNetCore.Mvc.Filters;

namespace DemoCoreMVC.Filter
{
    public class DoDoActionFilter : Attribute, IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {

            Console.WriteLine("********************On Action Executed********************");
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            Console.WriteLine("********************On Action Executing********************");
        }
    }

    public class AsyncDoDoActionFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {

            Console.WriteLine("********************On Async Action Executing********************");
            await next();
            Console.WriteLine("********************On Async Action Executed********************");
        }
    }
}

ActionExecutingContext は次のプロパティを提供します。

  • ActionArguments - アクション メソッドの入力を読み取るために使用されます。
  • コントローラー - コントローラー インスタンスを処理するために使用されます。
  • 結果 - 設定により、 Result アクション メソッドと後続のアクション フィルターの実行が短縮されます。

ActionExecutedContext は、および次のプロパティを提供し Controller ます Result 。

  • Canceled - アクションの実行が別のフィルター設定によって短絡された場合は true。
  • 例外 - アクションまたは以前に実行されたアクション フィルターが例外をスローした場合は NULL 以外。このプロパティを null に設定します。
    • 例外を効率的に処理します。
    • を実行し Result、アクションメソッドから返します。

の場合 IAsyncActionFilter、ActionExecutionDelegate の呼び出しにより次のことを実現できます。

  • 後続のすべてのアクション フィルターとアクション メソッドを実行します。
  • 返品 ActionExecutedContext

異常なフィルター

例外フィルター:

  • IExceptionFilter または IAsyncExceptionFilter を実装します。
  • 一般的なエラー処理戦略を実装するために使用できます。

次の例外フィルターの例は、アプリケーションの開発中に発生する例外の詳細を示しています。

using Microsoft.AspNetCore.Mvc.Filters;

namespace DemoCoreMVC.Filter
{
    public class DoExceptionFilter :Attribute, IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            Console.WriteLine("********************On Exception********************");
        }
    }

    public class DoAsyncExceptionFilter : Attribute, IAsyncExceptionFilter
    {
        public async Task OnExceptionAsync(ExceptionContext context)
        {
            await Task.Run(() =>
            {
                Console.WriteLine("********************On Exception Async********************");
            });

        }
    }
}

例外フィルター:

  • 前後のイベントはありません。
  • OnException または OnExceptionAsync を実装します。
  • Razor ページまたはコントローラーの作成、モデル バインド、アクション フィルター、またはアクション メソッドで発生する未処理の例外を処理します。
  • リソース フィルター、結果フィルター、または MVC 結果の実行で発生する例外をキャッチしないでください。

例外を処理するには、ExceptionHandled プロパティを設定する true か、Result プロパティを割り当てます。これにより、例外の伝播が停止されます。例外フィルターは例外を「成功」に変えることはできません。この変換を実行できるのはアクション フィルターのみです。

例外フィルター:

  • 操作中に発生する例外をキャッチするのに最適です。
  • エラー処理ミドルウェアほど柔軟ではありません。

例外を処理するにはミドルウェアを使用することをお勧めします。例外フィルターは、呼び出されるアクション メソッドに基づいてエラー処理が異なる場合にのみ使用されます。たとえば、アプリには API エンドポイントとビュー/HTML のアクション メソッドがある場合があります。API エンドポイントはエラー情報を JSON として返すことができますが、ビューベースの操作はエラー ページを HTML として返すことができます。

結果フィルター

結果フィルター:

  • インターフェースを実装します。
    • IResultFilter または IAsyncResultFilter
    • IAlwaysRunResultFilter または IAsyncAlwaysRunResultFilter
  • それらの実行は、操作の結果の実行を中心に展開します。
using Microsoft.AspNetCore.Mvc.Filters;

namespace DemoCoreMVC.Filter
{
    public class DoResultFilter :Attribute, IResultFilter
    {
        public void OnResultExecuted(ResultExecutedContext context)
        {
            Console.WriteLine("********************On Result Executed********************");
        }

        public void OnResultExecuting(ResultExecutingContext context)
        {
            Console.WriteLine("********************On Result Executing********************");
        }
    }

    public class DoAysncResultFilter :Attribute, IAsyncResultFilter
    {
        public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
        {
            Console.WriteLine("********************On Result Execution Async Executing********************");
            await next();
            Console.WriteLine("********************On Result Execution Async Executed********************");
        }
    }

}

フィルターテスト

以下に示すように、作成したフィルターを Home/Index に配置します。

[DoExceptionFilter]
[LogResourceFilter]
[DoResultFilter]
[DoDoActionFilter]
public IActionResult Index()
{
    _logger.LogInformation("Hello, 这是首页!");
    return View();
}

テストは次のようになります。

説明: 例外が生成されないため、例外フィルターには出力内容がありません。承認フィルターは追加されず、すべてのフィルターの前に開始され、すべてのフィルターの後に終了します。

グローバルアプリケーションをフィルタリングする

フィルターは単一のコントローラーまたはアクションに適用することも、グローバルに適用することもできます。コードは次のとおりです。

builder.Services.AddControllersWithViews(option =>
{
    option.Filters.Add<LogResourceFilter>();
    option.Filters.Add<DoExceptionFilter>();
    option.Filters.Add<DoResultFilter>();
    option.Filters.Add<DoDoActionFilter>();
});

グローバル テストは次のようになります。

以上がASP.NET Core MVCのFilterの入門から習得までの全内容です。

参照文書

公式ドキュメント: https://learn.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-6.0

おすすめ

転載: blog.csdn.net/fengershishe/article/details/131333274