2013-07-15 6 views
6

Mam program obsługi komunikatów API WWW MyHandler, który chcę uruchomić w potoku OWIN jako oprogramowanie pośrednie. Więc konfigurowanie programu obsługi w ten sposób.Konwertowanie HttpRequestMessage na OwinRequest i OwinResponse na 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); 
    } 
} 

Obsługa jest bardzo prosta i nic nie robi.

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

mogę umieścić punkt przerwania wewnątrz SendAsync i łamie ale następujący base.SendAsync bomby cicho i widzę A first chance exception of type 'System.InvalidOperationException' occurred in System.Net.Http.dll.

Mogę dość łatwo dodać MyHandler do config.MessageHandlers i będzie działać idealnie w potoku Web API, ale to nie jest to, co chcę zrobić. Chcę uruchomić MyHandler w potoku OWIN. Czy to w ogóle możliwe? Powinno być. W przeciwnym razie nie ma sensu posiadanie metody rozszerzenia UseHttpMessageHandler, jak sądzę. Po prostu nie mogłem znaleźć sposobu na zrobienie tego, co chcę robić.

+0

Myślę, że wprowadzasz w błąd koncepcje programów do obsługi wiadomości i programów do delegowania. Obsługa komunikatów jest po prostu czymś, co pobiera żądanie i zwraca odpowiedź. –

+0

Rozumiem różnicę między handlerami wiadomości a handlem delegującym. Handler delegujący to program obsługi komunikatów i miałem tylko nadzieję, że będę mógł korzystać z procedury obsługi delegowania zamiast obsługi komunikatów i magicznie będzie działał w potoku OWIN, tak jak działa w potoku Web API i najwyraźniej nie jest to możliwe , oparte na odpowiedzi Kirana. Zgadzam się, jestem zbyt ambitny. Dziękuję za spojrzenie na moje pytanie. – Badri

Odpowiedz

1

Tak, to doświadczenie wymaga poprawy, ponieważ wyjątek jest cicho ignorowany.

Dla powyższego scenariusza, trzeba by czerpać z HttpMessageHandler zamiast DelegatingHandler jako handler delegujący będzie próbował przekazać wniosek do ładowarki po nim (np Wyjątkiem wspomina Message=The inner handler has not been assigned).

Na przykład, następujących będzie działać:

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

I do tworzenia łańcucha koparki, można wykonać następujące czynności:

appBuilder.UseHttpMessageHandler(HttpClientFactory.CreatePipeline(innerHandler: new MyNonDelegatingMessageHandler(), 
      handlers: new DelegatingHandler[] { new DelegatingHandlerA(), new DelegatingHandlerB() })); 
+0

Dzięki, to wyjaśnia trochę. Jedno ostatnie pytanie. Czy tylko 'HttpMessageHandler' może zostać zmieniony w oprogramowanie pośrednie OWIN za pomocą adaptera? Miałem nadzieję, że uda nam się coś takiego dla delegowania opiekunów. W moim przypadku muszę również spojrzeć na komunikat odpowiedzi. – Badri

+0

Rozumiem. Dla pewności dwa rozszerzenia 'UseWebApi' łączą rozszerzenie' HttpServer' i 'UseHttpMessageHandler' nie podłączają go i dają ci opcje budowania potoku, o którym wspomniałem w poście. Teraz przychodzę do twojego pytania na temat odpowiedzi, myślę, że będziesz musiał podłączyć ogólne oprogramowanie pośredniczące OWIN, gdzie możesz sprawdzić odpowiedź, a nie HttpMessageHandler. Potok potokowy będzie wyglądał następująco: '-> MyOwinInspectorMiddleware-> HttpMessageHandlerAdapter-> HttpServer (HandlerA -> HanlerB -> itd.)' –

+0

@KiranChalla Witam, gdzie jest to rozszerzenie 'UseHttpMessageHandler'? Nie mogę znaleźć tego w źródle Katany. – Aliostad