我正在尝试记录我的Web API项目的HTTP响应头。
该项目采用VS2012、.NET 4.5和ASP.NET MVC4进行开发。
我已经编写了一个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获取头文件的值。response.Headers是一个空集合,response.Content.Headers只包含一个名为Content-Type的键,而HttpContext.Current为null。
我见过WebAPIContrib的代码,它们使用相同的逻辑来记录头,但它们的代码似乎也不起作用。
那么我应该如何跟踪Web API项目中的HTTP响应头呢?
发布于 2017-02-25 00:03:07
调用
消息处理程序的顺序与它们在
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...
}
}这样,任何其他处理程序都将有机会填充响应并记录该信息。
您还可以使用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
}
}应该能够在返回之前从响应中访问必要的详细信息。
发布于 2017-02-24 07:19:58
试试下面的代码。
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;
}
);发布于 2017-02-21 16:56:53
你必须找对地方:
request.Content.Headers.ContentType假设有一个Content-Type: application/json请求头,那么前面提到的将返回"application/json"。
因此,基本上,一些标题与内容相关联,这就是您应该从中读取它们的地方。
响应头也是如此。根据它们的类型,您可能需要从响应内容中提取它们(对于返回正文的请求)
response.Content.Headers.ContentTypehttps://stackoverflow.com/questions/18373835
复制相似问题