サービスへのリクエストの応答内容をログに記録したいのですが、どのように処理するのが最善なのか疑問に思っています。ここに私の特定の要件があります:
- 応答コンテンツは、パイプライン全体で 1 回シリアライズする必要があります。
- 応答コンテンツのみ、ヘッダーなしなど。
- ロギングは、すべての API のサブセットに適用されます。
要するに、可能な限り最小限のオーバーヘッドを追加しながら、すべての API のサブセットのログを追加したいと考えています。すべての API にロギングを追加したくない理由は、API の 1 つに繰り返しヒットするロード バランサーがあり、それらのリクエストをログに記録するのは役に立たないからです。
最初の要件を満たす唯一の例は、 IHttpModule を使用してフィルターを置き換えます (例: Logging raw HTTP request/response in ASP.NET MVC & IIS7 )。ただし、IHttpModule を使用すると、すべての API 応答がログに記録されますが、これは要件 3 を満たしていません。また、フィルターを置き換えると、要件 2 を簡単に満たすことはできません (ヘッダーはどこで終わり、コンテンツはどこで始まりますか?)。
要件 2 と 3 により、ログ記録用に ActionFilterAttribute と IFilterProvider に傾倒しています (例: http://haacked.com/archive/2011/04/25/conditional-filters.aspx/ )。そのシナリオで要件 1 を満たすために。
ハックは、HTTP コンテンツを ObjectContent ではなくシリアル化された StringContent として返すことですが、これは AcceptType の選択などの ASP.NET の機能に違反しています。