WebAPI 2.0呼叫监控

时间:2016-08-18 16:42:51

标签: asp.net-web-api2

使用ASP.NET WebAPI 2.0并有一个概念性问题。

想要保留任何用户/客户端调用的任何API的全局记录,如果它存储在数据库中,它会很棒。

实现这一目标的最佳机制是什么?

1 个答案:

答案 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());
    }
}