2013-07-15 7 views
6

Ich habe eine Web-API-Nachrichtenhandler MyHandler, die ich in OWIN-Pipeline als Middleware ausführen möchte. Konfigurieren Sie den Handler so.Konvertieren von HttpRequestMessage zu OwinRequest und OwinResponse zu 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); 
    } 
} 

Handler ist sehr einfach und tut nichts.

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

Ich habe einen Bruchstelle innerhalb SendAsync und es bricht aber die folgende base.SendAsync Bomben still, und ich sehe A first chance exception of type 'System.InvalidOperationException' occurred in System.Net.Http.dll.

Ich kann ganz einfach hinzufügen MyHandler zu config.MessageHandlers und es wird perfekt in der Web-API-Pipeline laufen, aber das ist nicht das, was ich tun möchte. Ich möchte MyHandler in der OWIN-Pipeline ausführen. Ist das überhaupt möglich? Es sollte sein. Sonst hat es keinen Sinn, die Erweiterungsmethode UseHttpMessageHandler zu verwenden, denke ich. Nur dass ich keinen Weg finden konnte, das zu tun, was ich tun wollte.

+0

Ich denke, Sie verwirren die Konzepte von Message-Handlern und delegieren Handler. Ein Message-Handler ist nur etwas, das eine Anfrage entgegennimmt und eine Antwort zurückgibt. –

+0

Ich verstehe den Unterschied zwischen Message-Handler und einem delegierenden Handler. Ein delegierender Handler ist ein Message-Handler und ich hatte nur gehofft, dass ich einen delegierenden Handler anstelle eines Message-Handlers verwenden kann und magisch in der OWIN-Pipeline laufen wird, so wie er in einer Web-API-Pipeline läuft und anscheinend nicht möglich ist basierend auf Kirans Antwort. Ich stimme zu, ich bin zu ehrgeizig. Danke, dass du meine Frage angeschaut hast. – Badri

Antwort

1

Ja, diese Erfahrung muss verbessert werden, da die Ausnahme stillschweigend ignoriert wird.

Für Ihr obiges Szenario würden Sie von HttpMessageHandler statt DelegatingHandler als die delegierenden Handler ableiten müssen versuchen würden, die Anfrage an Handler, nachdem es zu delegieren (Beispiel: Die Ausnahme erwähnt Message=The inner handler has not been assigned).

Zum Beispiel der folgende funktionieren würde:

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

Und für eine Kette von Behandlungsroutinen erstellen, können Sie folgendes tun:

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

Danke, das verdeutlicht einiges. Eine letzte Frage. Kann nur 'HttpMessageHandler' mit dem Adapter in eine OWIN-Middleware umgewandelt werden? Ich hatte gehofft, dass wir so etwas auch für die Delegierung von Handlern haben könnten. In meinem Fall muss ich auch die Antwortnachricht betrachten. – Badri

+0

Ich verstehe. Zur besseren Übersicht verbinden die beiden "UseWebApi" -Erweiterungen einen 'HttpServer' und die' UseHttpMessageHandler'-Erweiterung verbindet sie nicht und gibt Ihnen die Möglichkeit, eine Pipeline zu erstellen, wie ich sie im Post erwähnt habe. Nun zu Ihrer Frage über die Antwort, ich denke, Sie müssten eine allgemeine OWIN-Middleware, wo Sie die Antwort und nicht eine HttpMessageHandler überprüfen können. Die Request-Pipeline würde dann folgendermaßen aussehen: '-> MyOwinInspectorMiddleware-> HttpMessageHandlerAdapter-> HttpServer (HandlerA -> HanlerB -> etc)' –

+0

@KiranChalla Hallo, wo ist diese 'UseHttpMessageHandler'-Erweiterung? Ich kann es nicht in Katana finden. – Aliostad

Verwandte Themen