首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DelegatingHandler中没有响应头

DelegatingHandler中没有响应头
EN

Stack Overflow用户
提问于 2013-08-22 15:07:54
回答 3查看 1.8K关注 0票数 17

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

该项目采用VS2012、.NET 4.5和ASP.NET MVC4进行开发。

我已经编写了一个DelegatingHandler子类,如下所示:

代码语言:javascript
复制
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获取头文件的值。response.Headers是一个空集合,response.Content.Headers只包含一个名为Content-Type的键,而HttpContext.Currentnull

我见过WebAPIContrib的代码,它们使用相同的逻辑来记录头,但它们的代码似乎也不起作用。

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

EN

回答 3

Stack Overflow用户

发布于 2017-02-25 00:03:07

调用

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

确保在流水线的早期注册了日志记录处理程序。最好是先来。

代码语言:javascript
复制
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...
    }
}

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

您还可以使用async/await语法来简化该类,使对响应的访问更加清晰。

代码语言:javascript
复制
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
    }
}

应该能够在返回之前从响应中访问必要的详细信息。

参考:HTTP Message Handlers in ASP.NET Web API

票数 4
EN

Stack Overflow用户

发布于 2017-02-24 07:19:58

试试下面的代码。

代码语言:javascript
复制
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;
                        }
            );
票数 2
EN

Stack Overflow用户

发布于 2017-02-21 16:56:53

你必须找对地方:

代码语言:javascript
复制
request.Content.Headers.ContentType

假设有一个Content-Type: application/json请求头,那么前面提到的将返回"application/json"

因此,基本上,一些标题与内容相关联,这就是您应该从中读取它们的地方。

响应头也是如此。根据它们的类型,您可能需要从响应内容中提取它们(对于返回正文的请求)

代码语言:javascript
复制
response.Content.Headers.ContentType
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18373835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档