Bad*_*dri 6 c# asp.net-web-api owin katana
我有一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
处理程序非常简单,什么都不做.
public class MyHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{ // <--- breakpoint here
var response = await base.SendAsync(request, cancellationToken);
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
我在里面放了一个断点SendAsync
,它确实打破但是下面的base.SendAsync
炸弹默默地看着我A first chance exception of type 'System.InvalidOperationException' occurred in System.Net.Http.dll
.
我可以很容易地添加MyHandler
到config.MessageHandlers
它,它将在Web API管道中运行完美,但这不是我想要做的.我想MyHandler
在OWIN管道中运行.这有可能吗?它应该是.否则,UseHttpMessageHandler
我猜是没有必要使用扩展方法.只是我想不出办法做我想做的事.
是的,这种体验需要改进,因为异常被默默地忽略了。
对于上面的场景,您需要派生而HttpMessageHandler
不是因为DelegatingHandler
委托处理程序会尝试将请求委托给其后的处理程序。(示例:异常提到Message=The inner handler has not been assigned
)
例如,以下内容可以工作:
appBuilder.UseHttpMessageHandler(new MyNonDelegatingHandler());
public class MyNonDelegatingHandler : HttpMessageHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = new HttpResponseMessage();
response.Content = new StringContent("Hello!");
return Task.FromResult<HttpResponseMessage>(response);
}
}
Run Code Online (Sandbox Code Playgroud)
为了创建处理程序链,您可以执行以下操作:
appBuilder.UseHttpMessageHandler(HttpClientFactory.CreatePipeline(innerHandler: new MyNonDelegatingMessageHandler(),
handlers: new DelegatingHandler[] { new DelegatingHandlerA(), new DelegatingHandlerB() }));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3986 次 |
最近记录: |