- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试记录我的 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
}
}
应该能够在返回之前从响应中访问必要的详细信息。
关于c# - DelegatingHandler 中没有响应头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18373835/
如何对自定义 DelegatingHandler 进行单元测试?我有以下内容,但它提示未设置 innerHandler。 var httpRequestMessage = new HttpReques
我正在尝试记录我的 Web API 项目的 HTTP 响应 header 。 本项目采用VS2012、.NET 4.5和ASP.NET MVC 4开发。 我写了一个 DelegatingHandler
我正在尝试对 DelegateHandler 的实现进行单元测试。我的简化实现: public class FooHandler : DelegatingHandler { prote
我正在尝试对 DelegateHandler 的实现进行单元测试。我的简化实现: public class FooHandler : DelegatingHandler { prote
在 ASP.NET Core 2.1 应用程序中,我使用 HttpClient 发出 REST 请求。我正在使用 DelegatingHandler 来定义一些常见行为。注册我在这里: private
我是依赖注入(inject)的新手,但对 Ninject 和 Ninject.Extensions.Logging 到 [Inject] 我的 ILogger 很满意 无论我需要什么。 但是一些Del
我目前正在使用几个委托(delegate)处理程序(派生自 DelegatingHandler 的类)在发送请求之前处理请求,例如验证签名等。这一切都非常好,因为我不' 必须对所有调用重复签名验证(例
我有代码将命名的 HttpClient 添加到 ServiceCollection 并将 DelegatingHandler 添加到客户端。示例代码: public class MyDelegatin
我正在尝试对 DelegatingHandler 使用依赖注入(inject)包含 2 个接口(interface)和 1 个字符串。 public class MessageHandler : De
DelegatingHandler继承自 HttpMessageHandler .但是,我不明白其中的区别,因为您必须实现相同的方法,SendAsync使两者都起作用。 这两个处理程序有什么区别?我应
我有以下代码,在转发到我的 localhost:1671 时工作正常: protected override async System.Threading.Tasks.Task SendAsync(H
我在类库中有一个自定义的 DelegatingHandler,我需要用 Autofac 注册它。 webapi 宿主解决了它对运行时的依赖,因此宿主没有对该库的引用。 public class Loc
在我的应用程序中,我们从客户端发送大小适中的数据包并接收大小适中的响应,因此我想在向上和返回的过程中实现一些压缩。 在回来的路上它很好,因为我可以依靠 IIS 的动态压缩来为我做这件事,但在回来的路上
在WebAPI自托管应用程序中,DelegatingHandler的SendAsync()方法和ApiController的任何方法是否总是在同一线程上执行? 使用[ThreadStatic]变量将R
我想知道是否可以在 DelegatingHandler 的 SendAsync 方法中访问正在执行(或即将执行)的 Controller ?我似乎不知道如何访问它,我认为这是因为它在 Controll
我正在尝试了解 Web API Http 管道的工作原理! 在我的 Web API 项目中,我使用以下技术来记录/处理异常: ExceptionHandler -> 在全局级别处理异常 Excepti
我正在尝试在 ASP.NET WebAPI 项目中记录整个传入请求和传出响应。虽然我同意 DelegatingHandler,但我的雇主坚持使用 HttpModule。您如何向她解释为什么我们应该使用
我有一个 MVC/Web API 混合项目,我添加了一个简单的 DelegatingHandler 实现来包装 API 响应。这很好用,但处理程序也被调用以请求 MVC Controller 。我的理
我有一个 Web API,它是一个非常薄的基础架构,只包含两个 DelegatingHandler 实现,它们将传入消息分派(dispatch)到业务层中定义的消息处理程序实现。这意味着没有 Cont
我正在阅读文章并检查示例,我发现 Owin 中间件的使用方式与 WebAPI DelegatingHandler 相同:记录传入请求、验证 header 等。 我唯一的理解是 Owin 中间件在管道中
我是一名优秀的程序员,十分优秀!