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

2024-02-25

我有一个 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);
    }
}

Handler非常简单,什么也不做。

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;
    }
}

我在里面放了一个断点SendAsync它确实打破了,但以下内容base.SendAsync无声地炸弹,我看到A first chance exception of type 'System.InvalidOperationException' occurred in System.Net.Http.dll.

我可以很容易地添加MyHandler to 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);
    }
}

为了创建处理程序链,您可以执行以下操作:

appBuilder.UseHttpMessageHandler(HttpClientFactory.CreatePipeline(innerHandler: new MyNonDelegatingMessageHandler(),
           handlers: new DelegatingHandler[] { new DelegatingHandlerA(), new DelegatingHandlerB() }));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 HttpRequestMessage 转换为 OwinRequest 并将 OwinResponse 转换为 HttpResponseMessage 的相关文章

随机推荐