【问题标题】:WebAPI log only when content type equal to json仅当内容类型等于 json 时才记录 WebAPI
【发布时间】:2018-10-18 15:07:51
【问题描述】:

目前,我有一个全局注册的处理程序来捕获各种请求和响应。然而,系统包含一些端点,其内容类型为 pdf 或 csv。

   public class LogRequestAndResponseHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // log request body
            var requestBody = await request.Content.ReadAsStringAsync();

            LogUtil.Info("[" + request.GetCorrelationId() + "] Call:" + request.RequestUri,"httpTrace");
            if(!string.IsNullOrEmpty(requestBody))
            LogUtil.Info(requestBody,"httpTrace");

            // let other handlers process the request
            var result = await base.SendAsync(request, cancellationToken);

            if (result.Content != null)
            {

                // once response body is ready, log it
                var responseBody = await result.Content.ReadAsStringAsync();
                //LogUtil.Info(responseBody,"httpTrace");
                LogUtil.Info("[" + request.GetCorrelationId().ToString() + "] Return:" + responseBody,"httpTrace");
            }

            return result;
        }
    }

我正在使用上面的代码,每当调用 pdf 端点时,整个 pdf 正文将被捕获到二进制格式的日志中。

我想知道仅过滤 json 正文或标头进行记录的最佳方法是什么。

【问题讨论】:

    标签: c# asp.net-web-api2 nlog


    【解决方案1】:

    客户端和服务器都应该使用Content-Type 标头来指示正文的内容类型。

    您可以同时检查请求和响应 - 可能是这样的:

    public class LogRequestAndResponseHandler : DelegatingHandler
    {
    
        private bool ShouldLog(IDictionary<string, IEnumerable<string>> headers)
        {
            if (headers.TryGetValue("Content-Type", out IEnumerable<string> values))
            {
                if (values.Any(x => x == "application/json"))
                    return true;
            }
    
            return false;
        }
    
    
        protected override async Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // log request body
    
            if (ShouldLog(request.Headers.ToDictionary(x => x.Key, x => x.Value)))
            {
                var requestBody = await request.Content.ReadAsStringAsync();
                LogUtil.Info("[" + request.GetCorrelationId() + "] Call:" + request.RequestUri, "httpTrace");
                if (!string.IsNullOrEmpty(requestBody))
                    LogUtil.Info(requestBody, "httpTrace");
            }
    
    
            // let other handlers process the request
            var result = await base.SendAsync(request, cancellationToken);
    
            if (result.Content != null)
            {
                if (ShouldLog(result.Headers.ToDictionary(x => x.Key, x => x.Value)))
                {
                    // once response body is ready, log it
                    var responseBody = await result.Content.ReadAsStringAsync();
                    //LogUtil.Info(responseBody,"httpTrace");
                    LogUtil.Info("[" + request.GetCorrelationId().ToString() + "] Return:" + responseBody, "httpTrace");
                }
            }
    
            return result;
        }
    
    }
    

    您可能需要进一步完善它,也许您还想记录text/plain 或其他一些类型,但这应该可以帮助您入门。

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2016-05-07
      • 2010-10-23
      相关资源
      最近更新 更多