asp.netコアミドルウェアとフィルター


89

asp.netコアミドルウェアについて読んだ後、同じ目標を達成しているように見えるので、いつフィルターを使用すべきか、いつミドルウェアを使用すべきか混乱しています。フィトラーの代わりにミドルウェアを使用する必要があるのはいつですか?


1
このドキュメントは、その特定の質問を対象としています。docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…–
Nkosi

回答:


83

これに関するビデオがチャネル9にあります: ASP.NET Monsters#91:ミドルウェアvs.フィルター。ビデオを要約すると:

リクエストの実行が開始され、ミドルウェアと別のミドルウェアがあります。これは「人形の中のロシアの人形」のように考えられ、最終的にルーティングミドルウェアが起動し、リクエストがMVCパイプラインに入ります。 ここに画像の説明を入力してください したがって、MVCのコンテキストを必要としない場合(ヘッダーへの応答や事前ルーティングメカニズムなど、フローと実行について懸念している場合など)、ミドルウェアを使用します。
ただし、MVCのコンテキストが必要で、アクションに対して操作する場合は、フィルターを使用します。


したがって、すべてのリクエストで実行したいロジック(たとえばロギング)があり、その一部のみがMVCに関連している場合は、それをミドルウェアに配置し、フィルターハンドラーに必要な特定のロジックを実行させます。ミドルウェアに再スローしますか?
テリー

69

ミドルウェアはASP.NETCoreのレベルで動作し、アプリケーションに着信するすべての要求に対応できます。

一方、MVCフィルターは、MVCに送信される要求に対してのみ実行されます。

したがって、たとえば、すべての要求をHTTPS経由で実行する必要があることを強制したい場合は、そのためにミドルウェアを使用する必要があります。それを行うMVCフィルターを作成した場合でも、ユーザーはHTTP経由で静的ファイルなどを要求できます。

しかし一方で、MVCコントローラーで要求期間をログに記録するものは絶対にアクションフィルターになる可能性があります。


5

の実行はmiddleware、MVCコンテキストがパイプラインで使用可能になる前に発生します。つまり、たとえばActionFilterの場合middlewareActionExecutingContextまたはにアクセスできませんActionExecutedContext。アクセスできるのは、ですHttpContext。これにより、応答だけでなく要求に対してもアクションを実行できます。モデルのバインドはまだ行われていないため、ミドルウェアの使用は、検証関数の実行や値の変更には適していません。Middlewareまた、呼び出されるコントローラーまたはアクションに関係なく、すべての要求で実行されます。

一方、filtersスタートアップでフィルターをグローバルに登録しない限り、指定されたアクションとコントローラーでのみ実行されます。コンテキストへのフルアクセスがあるため、コントローラーとアクション自体にもアクセスできます。

ソースと例:dotnetcultist.com

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.