gpt4 book ai didi

c# - DelegatingHandler 中没有响应头

转载 作者:可可西里 更新时间:2023-11-01 03:02:12 27 4
gpt4 key购买 nike

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

本项目采用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 中获取 header 值。 response.Headers 是一个空集合,response.Content.Headers 只包含一个名为 Content-Type 的键和 HttpContext。当前null

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

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

最佳答案

Message handlers are called in the same order that they appear in MessageHandlers collection. Because they are nested, the response message travels in the other direction. That is, the last handler is the first to get the response message.

确保日志处理程序在管道的早期注册。最好先。

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 语法简化类,以更清晰地访问响应。

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

关于c# - DelegatingHandler 中没有响应头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18373835/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com