DelegatingHandler中没有响应头应该怎么解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (103)

我正在尝试记录我的Web API项目的HTTP响应标题。

该项目由VS2012,.NET 4.5和ASP.NET MVC 4开发。

我写过这样的DelegatingHandler子类:

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

        // Execute the request
        return base.SendAsync(request, cancellationToken).ContinueWith(task =>
        {
            var response = task.Result;
            return response;
        });
    }
}

但是问题是无法从中获取标题值。response.Headers是空集,response.Content.Headers只含有一个关键命名Content-Type,并且HttpContext.Currentnull

那么应该如何跟踪Web API项目中的HTTP响应头呢?

提问于
用户回答回答于

试试下面的代码。

return base.SendAsync(request, cancellationToken).ContinueWith(
                        task =>
                        {

                            var headers = task.Result.ToString();
                            var body = task.Result.Content.ReadAsStringAsync().Result;

                            // RETURN THE ORIGINAL RESULT
                            var response = task.Result;
                            return response;
                        }
            );
用户回答回答于

消息处理程序按照它们出现在MessageHandlers集合中的顺序调用。因为它们是嵌套的,所以响应消息沿另一个方向传播。也就是说,最后一个处理程序是第一个获取响应消息的处理程序。

确保日志处理程序在管道中提前注册。

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        config.MessageHandlers.Add(new LoggingHandler(...));

        //...add other handlers
        config.MessageHandlers.Add(new MessageHandler1());
        config.MessageHandlers.Add(new MessageHandler2());

        // Other code not shown...
    }
}

这样,其他任何处理程序都有机会填充响应并记录该信息。

可以使用异步/等待语法来简化该类,以使访问响应更清晰。

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

        //...Extract and log request
        LogRequest(request);

        // Send the request on to the inner handler(s) and get the response
        var response = await base.SendAsync(request, cancellationToken);

        //...Extract details from response for logging
        LogResponse(response);

        return response;
    }

    private void LogRequest(HttpRequestMessage request) {
        //... code removed for brevity
    }

    private void LogResponse(HttpResponseMessage response) {
        //... code removed for brevity
    }
}

在返回之前,应该能够从响应中访问必要的细节。

扫码关注云+社区

领取腾讯云代金券