この2つは同じような目的を持っているようです。長所と短所を重ねて使用する場合の例をいくつか見て、主な違いを指摘するのは素晴らしいことです。
2 に答える
2つの主な違いは焦点です。メッセージハンドラはすべてのHTTPリクエストに適用されます。それらはHTTP仲介者の機能を実行します。フィルタは、フィルタが適用される特定のコントローラ/アクションにディスパッチされるリクエストにのみ適用されます。
動作を大多数のリクエストに適用する場合は、MessageHandlersを使用する必要があります。フィルタは、特定のリソースにのみ適用できる場合に使用する必要があります。
ハンドラーとアクションフィルターの大きな違いは、それらが実行される段階です。アクションフィルターは、コントローラーのディスパッチとモデルバインディングが発生した後に実行されるため、要求を処理しているコントローラーインスタンスと対話したり、アクションメソッドに渡された型付きモデルオブジェクトに直接アクセスしたりできます。このアプローチを使用して、要求/応答値の高度なログ記録を実行しました。コントローラーにアクセスできたため、要求の処理方法に関する追加情報をログに記録できました。
メッセージハンドラーはプロセスの早い段階で実行され、フィルターよりも生の要求/応答値に非常に近く動作します(ハンドラーで使用されるHttpRequestMessage / HttpResponseMessageオブジェクトと、フィルター内で使用可能なはるかに豊富なHttpActionContextおよびHttpActionExecutedContextオブジェクトを比較してください)。これにより、たとえば、リクエストを早期に終了する必要があるかどうかを判断しようとしている場合など、一部のアクティビティで効率が上がる可能性があります。要求を拒否する必要があることがわかっている場合、ハンドラーを使用すると、WebApiインフラストラクチャーがコントローラーのインスタンス化、モデルバインディングの実行などを行う前に、これを行うことができます。
もう1つの違いは、ハンドラーがチェーンされていることと、チェーンの実行方法をより細かく制御できることです。フィルタは順番に呼び出されますが、1つのフィルタで応答を設定すると、リクエストが効果的に終了し、リスト内の次のフィルタが実行されなくなります。たとえば、モデルがnullの場合に不正な要求を返す最初のフィルターと、要求をログに記録する2番目のフィルターがある場合、最初のフィルターによって不正な要求が生成されると、2番目のフィルターは実行されません。ハンドラーを使用すると、(必ずしもお勧めできるわけではありませんが)内部ハンドラーを呼び出して、ハンドラーチェーンを正常に動作させることができます。