ASP.NET Core のフィルター

1. フィルタの定義

Filter (フィルター、「フィルター」とも訳せる) は、ASP.NET Coreで提供されるアスペクト プログラミング メカニズムであり、開発者が横断的な問題に対処するためのカスタム フィルターを作成できるようにします。つまり、 ASP.NET Core で実行されるカスタム コードを特定の場所に配置します。たとえば、コントローラーの操作メソッドの前にデータ検査を実行するコードや、ActionResult の実行時にカスタム データを応答ヘッダーに書き込むコードなどです。

ASP.NET Core には、承認フィルター、リソース フィルター、操作フィルター、例外フィルター、結果フィルターの 5 種類のフィルターがあります。プロジェクトを開発するときは、通常、カスタム承認フィルターを作成する代わりに、承認ポリシーを構成するか、カスタム承認ポリシーを作成します。カスタム承認フィルターは、カスタム承認フレームワークが必要な場合にのみ使用されます。同様の原則がリソース フィルターと結果フィルターに適用されるため、このセクションでは例外フィルターとアクション フィルターに焦点を当てます。

通常、すべてのフィルターには同期バージョンと非同期バージョンがあります。たとえば、同期アクション フィルターは IActionFilter インターフェイスを実装し、非同期アクション フィルターは IAsyncActionFilter インターフェイスを実装します。ほとんどのシナリオでは、非同期フィルターの方がパフォーマンスが高く、実装クラスでの非同期呼び出しコードの作成をサポートできます。

2. フィルタの実行順序

3. 実現

パブリック クラス MyExceptionFilter : IAsyncExceptionFilter

{

プライベート読み取り専用 ILogger<MyExceptionFilter> ロガー;

プライベート読み取り専用 IHostEnvironment 環境;

public MyExceptionFilter(ILogger<MyExceptionFilter> ロガー、IHostEnvironment 環境)

{

this.logger = ロガー;

this.env= 環境;

}

public タスク OnExceptionAsync(ExceptionContext context)

{

例外 例外 = context.Exception;

logger.LogError(例外,"UnhandledException が発生しました");

文字列メッセージ。

if(env.IsDevelopment())

メッセージページ =例外.tostring();

それ以外

message="例外を処理すると思われるプログラム";

objeckResult 結果 = new ObjectResult (nesw(code=500,massage =message });

結果.ステータスコード = 500;

内容 結果 = 結果;

centent Excoptionlandled =true;

Task.CompletedTask を返します。

}}

非同期例外フィルターは、IAsyncExceptionFilter インターフェースを実装する必要があります。フィルタは例外情報を 88 ウェルに記録し、プログラムワードの実行環境を判断する必要があるため、フィルタは ILogger と IHostEnvircament の 2 つのサービスを注入する必要があります。12 行目で context.Exception を使用して例外オブジェクトを取得し、13 行目で例外をログに書き込み、14 行目から 18 行目でアプリケーションの動作環境を検出します。メッセージの値を決定するプログラム 例外スタックのプロンプトを表示するかどうか 当然ですが、本番環境では、プログラムの機密情報の漏洩を避けるために、例外スタックを表示することはできません。19~21行目で応答メッセージの内容を設定しています。コードの 22 行目では、contextExceptionHandled の値を true に設定し、デフォルトの例外応答ロジックを実行しないように ASPNET Core に指示します。

次に、Program.cs のビルダー Build の前にコードを追加して、グローバル フィルターを設定します。

builder.Services.Configure<MycOptions>(options =>

{

オプション フィルター .Add<MyExceptionfiiter>();

});

おすすめ

転載: blog.csdn.net/qq_71012549/article/details/128650047