将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() }));
- 如何在ASP.NET Core Web Api中完成版本控制
- .NET Core – 尝试将存储库添加到我的API控制器,但是当我执行每个控制器方法时都会返回500错误
- WebAPI OData $跳过自定义IQueryable double应用
- 在Web API中的id参数之后使用操作进行路由
- 使用WebApi,ajax上传文件
- 在Web Api控制器中将JSON反序列化为字典
- HttpClient调用Windows-Authenication ApiController方法…但没有WindowsIdentity出现
- 如何定义路由中的PUT方法仅限于没有参数的控制器中的Put方法?
- 无法将当前JSON数组(例如)反序列化为类型’TenantManagementWebApi.Entities.Tenant