2016-08-18 105 views
0

使用ASP.NET WebAPI 2.0並有一個概念性問題。WebAPI 2.0呼叫監測

想保留任何用戶/客戶端調用的任何API的全局記錄,如果這存儲在數據庫中,那將是非常棒的。

什麼是最好的機制來完成這個?

回答

2

我'使用DelegatingHandler長時間在幾個項目中做得很好。

public class ApiCallLogHandler : DelegatingHandler { 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { 

     var started = DateTime.UtcNow; 
     HttpResponseMessage response = null; 
     Exception baseException = null; 

     try { 
      response = await base.SendAsync(request, cancellationToken); 
     } catch(Exception exception) { 
      CommonLogger.Logger.LogError(exception); 
      baseException = exception; 
     } 

     try { 
      var callModel = await GetCallModelAsync(request, response); 
      if(baseException != null) 
       callModel.Exception = baseException 
      callModel.ExecutionTime = (DateTime.UtcNow - started).ToString(); 
      await CommonLogger.Logger.LogApiCallAsync(callModel); 
     } catch (Exception exception) { 
      CommonLogger.Logger.LogError(exception); 
     } 

     return response; 
    } 

    private async Task<ApiCallModel> GetCallModelAsync(HttpRequestMessage request, HttpResponseMessage response) { 
     // parse request and response and create a model to store in database... 
    } 
} 

通過這種方法,你可以跟蹤執行過程中的所有請求,例外,每個API調用的甚至是全響應。

ApiCallModel只是一個簡單的POCO類,您應該填寫您的請求和響應所需的數據。

CommonLogger.Logger.*是您的記錄機制。

而且,你必須在這個片段中註冊的處理程序:

public static class WebApiConfig { 
    public static void Register(HttpConfiguration config) { 
     config.MessageHandlers.Add(new ApiCallLogHandler()); 
    } 
} 
+0

由於這是偉大的,我將如何能夠將數據保存在數據庫中? – user1144596

+0

@ user1144596我不明白):在'CommonLogget.Logger。*'中執行或者只是一個自定義方法。您可以使用EF或NH或ASO.NET或任何其他您想要的機制。你能更具體嗎? –

+0

啊,我明白你的意思了。謝謝 – user1144596