2017-05-05 14 views
0

WebAPI 2でMessageHandlerを使用していくつかのログを実装しました。ASP.NET WebAPI 2 - ログの前に応答を返すMessageHandler

ロギングが発生した後にだけ応答が返されるようです。ユーザーが応答を受け取るのはいいでしょうが、ロギングは思考後にすることができます。これは可能ですか?

public abstract class MessageHandler : DelegatingHandler 
{ 
    protected HttpRequestMessage requestMessage; 
    protected HttpResponseMessage responseMessage; 

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage requestMessage, CancellationToken token) 
    { 
     var requestTime = DateTime.Now; 
     this.requestMessage = requestMessage; 
     responseMessage = await base.SendAsync(requestMessage, token); 
     var responseTime = DateTime.Now; 

     await LogEntryAsync(requestTime, responseTime); 
     return responseMessage; 
    } 

    protected abstract Task LogEntryAsync(DateTime requestTime, DateTime responseTime); 
} 

答えて

0

はい、もちろん可能です。 これを処理する通常の方法は、すべてのソースからのログを処理するスレッドが消費する並行キューにメッセージを配置することです。 スレッドとキューはに似たインターフェースでLoggerクラス内にカプセル化されるだろう:

public class ILog 
{ 
    void Debug(....); 
    void Info(....); 
    void Warning(....); 
} 

し、あなたのコードは次のようになります(たとえばデータベースやファイルのログ用)ですブロッキング

ILog Log {get; set;} 

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage requestMessage, CancellationToken token) 
{ 
    var requestTime = DateTime.Now; 
    this.requestMessage = requestMessage; 
    responseMessage = await base.SendAsync(requestMessage, token); 
    var responseTime = DateTime.Now; 

    log.Info(requestTime, responseTime); // No async needed 
    return responseMessage; 
} 

ユーザーのHTTPセッションを処理するメインスレッドの代わりにコンシューマースレッドで発生します。

本当の疑問は、包括的なログソリューションに時間を費やすことなく達成したいと考えているよりも、広く利用可能なライブラリがすでにあなたのために、 Log4Net、共通ロギング)。

関連する問題