C# 将HttpRequestMessage转换为OwinRequest,将OwinResponse转换为HttpResponseMessage

C# 将HttpRequestMessage转换为OwinRequest,将OwinResponse转换为HttpResponseMessage,c#,asp.net-web-api,owin,katana,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();

我有一个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;
    }
}
公共类MyHandler:DelegatingHandler
{
受保护的覆盖异步任务SendAsync(
HttpRequestMessage请求,CancellationToken CancellationToken)

{/是的,这种体验需要改进,因为异常被悄悄地忽略了

对于上述场景,您需要从
HttpMessageHandler
派生,而不是
DelegatingHandler
,因为委托处理程序将尝试将请求委托给之后的处理程序。(示例:异常提到
消息=内部处理程序尚未分配

例如,以下方法可行:

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

谢谢,这澄清了很多。最后一个问题。只能使用适配器将
HttpMessageHandler
转换为OWIN中间件吗?我希望我们也可以像这样委派处理程序。在我的情况下,我也需要查看响应消息。我明白了。为了更清楚,这两个
使用WebAPI
扩展连接一个
HttpServer
usehttmpessagehandler
扩展没有连接它,而是提供了构建管道的选项,就像我在文章中提到的那样。现在来看看你关于查看响应的问题,我想你需要连接一个通用的OWIN中间件,在这里你可以检查响应,而不是httpess然后请求管道看起来像:
->myowinspectormddware->HttpMessageHandlerAdapter->HttpServer(HandlerA->handlerb->etc)
@KiranChalla嗨,这
UseHttpMessageHandler
扩展在哪里?我在Katana源代码中找不到它。@Aliostad:它是System.Web.Http.OwinI的一部分。我认为你混淆了消息处理程序和委托处理程序的概念。消息处理程序只是接收请求并返回响应的东西。我确实理解不同之处消息处理程序和委派处理程序之间的关系。委派处理程序是一个消息处理程序,我只是希望我能够使用委派处理程序来代替消息处理程序,神奇地,它将在OWIN管道中运行,就像它在Web API管道中运行一样,根据Kiran的回答,这显然是不可能的。我同意我的看法太野心勃勃了。谢谢你看我的问题。
appBuilder.UseHttpMessageHandler(HttpClientFactory.CreatePipeline(innerHandler: new MyNonDelegatingMessageHandler(),
           handlers: new DelegatingHandler[] { new DelegatingHandlerA(), new DelegatingHandlerB() }));