使用ASP.NET WebAPI 2.0并有一个概念性问题。
想要保留任何用户/客户端调用的任何API的全局记录,如果它存储在数据库中,它会很棒。
实现这一目标的最佳机制是什么?
答案 0 :(得分: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());
}
}