2013-07-15 36 views
6

我有一個Web API消息處理程序MyHandler,我想在OWIN管道中作爲中間件運行。因此像這樣配置處理程序。將HttpRequestMessage轉換爲OwinRequest和OwinResponse以HttpResponseMessage

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<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添加到config.MessageHandlers,它將在Web API管道中完美運行,但這不是我想要做的。我想在OWIN管道中運行MyHandler。這可能嗎?它應該是。否則,我想,擴展方法UseHttpMessageHandler毫無意義。只是我無法想出辦法去做我想做的事。

+0

我認爲你混淆了消息處理程序和委託處理程序的概念。消息處理程序只是接受請求並返回響應的東西。 –

+0

我明白消息處理程序和委託處理程序之間的區別。委託處理程序是一個消息處理程序,我只是希望能夠使用委託處理程序來代替消息處理程序,並且神奇地它將在OWIN管道中運行,就像它在Web API管道中運行一樣,顯然這是不可能的,基於Kiran的答覆。我同意我太雄心勃勃。感謝您看我的問題。 – Badri

回答

1

是的,這種體驗需要改進,因爲這個例外被忽略了。

爲了您上面的場景中,你需要從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() })); 
+0

謝謝,這澄清了很多。最後一個問題。只能使用適配器將「HttpMessageHandler」變成OWIN中間件?我希望我們也可以像這樣委託處理程序。就我而言,我也需要查看響應消息。 – Badri

+0

我明白了。爲了清楚起見,兩個'UseWebApi'擴展連接了一個'HttpServer'和'UseHttpMessageHandler'擴展並沒有連接它,並且給你選擇了像我在文章中提到的那樣構建管道。現在回過頭看看響應的問題,我認爲您需要掛鉤一般的OWIN中間件,您可以在其中檢查響應而不是HttpMessageHandler。然後,請求管道將如下所示:' - > MyOwinInspectorMiddleware-> HttpMessageHandlerAdapter-> HttpServer(HandlerA - > HanlerB - > etc)' –

+0

@KiranChalla嗨,UseHttpMessageHandler擴展名在哪裏?我在Katana來源找不到它。 – Aliostad

相關問題