将HttpRequestMessage转换为OwinRequest和OwinResponse转换为HttpResponseMessage

我有一个Web API消息处理程序MyHandler ,我想在OWIN管道中作为中间件运行。 所以像这样配置处理程序。

 public class Startup { public void Configuration(IAppBuilder app) { app.UseHttpMessageHandler(new MyHandler()); HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( "DefaultWebApi", "{controller}/{id}", new { id = RouteParameter.Optional }); app.UseWebApi(config); } } 

处理程序非常简单,什么都不做。

 public class MyHandler : DelegatingHandler { protected override async Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { // <--- breakpoint here var response = await base.SendAsync(request, cancellationToken); return response; } } 

我在SendAsync设置了一个断点,它确实中断但是下面的base.SendAsync静默base.SendAsync炸弹,我看到A first chance exception of type 'System.InvalidOperationException' occurred in System.Net.Http.dll

我可以很容易地将MyHandler添加到config.MessageHandlers ,它将在Web API管道中运行完美,但这不是我想要做的。 我想在OWIN管道中运行MyHandler 。 这有可能吗? 它应该是。 否则,我猜有扩展方法UseHttpMessageHandler是没有意义的。 只是因为我无法想办法做我想做的事。

是的,这个经验需要改进,因为例外被默默地忽略了。

对于上面的场景,您需要派生自HttpMessageHandler而不是DelegatingHandler因为委托处理程序会尝试将请求委托给处理程序。(示例:exception提及Message=The inner handler has not been assigned

例如,以下方法可行:

 appBuilder.UseHttpMessageHandler(new MyNonDelegatingHandler()); public class MyNonDelegatingHandler : HttpMessageHandler { protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { HttpResponseMessage response = new HttpResponseMessage(); response.Content = new StringContent("Hello!"); return Task.FromResult(response); } } 

要创建一系列处理程序,您可以执行以下操作:

 appBuilder.UseHttpMessageHandler(HttpClientFactory.CreatePipeline(innerHandler: new MyNonDelegatingMessageHandler(), handlers: new DelegatingHandler[] { new DelegatingHandlerA(), new DelegatingHandlerB() }));