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>();
});