2017-05-05 39 views
0

我通過MessageHandler在WebAPI 2中實現了一些日誌記錄。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會話的主線程。

真正的問題是,爲什麼當數個廣泛可用的庫已經爲您實現時,您希望自己實現這個功能,並且比您希望在不花費大量時間在綜合日誌解決方案上實現更好的功能(請參見NLog, Log4Net,CommonLogging)。

相關問題