2013-07-15 6 views
6

Ho un gestore di messaggi API Web MyHandler che voglio eseguire nella pipeline OWIN come middleware. Quindi configurando il gestore come questo.Conversione di HttpRequestMessage a OwinRequest e OwinResponse a 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); 
    } 
} 

Il gestore è molto semplice e non fa nulla.

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

ho messo un punto di rottura all'interno SendAsync e si rompe, ma il seguente base.SendAsync bombe in silenzio e vedo A first chance exception of type 'System.InvalidOperationException' occurred in System.Net.Http.dll.

Posso facilmente aggiungere MyHandler a config.MessageHandlers e funzionerà perfettamente nella pipeline dell'API Web, ma non è quello che voglio fare. Voglio eseguire MyHandler nella pipeline OWIN. Ciò è effettivamente possibile? Dovrebbe essere. Altrimenti, non ha senso avere il metodo di estensione UseHttpMessageHandler, immagino. Solo che non riuscivo a capire un modo per fare quello che voglio fare.

+0

Penso che tu stia confondendo i concetti dei gestori di messaggi e delegando i gestori. Un gestore di messaggi è solo qualcosa che richiede una richiesta e restituisce una risposta. –

+0

Comprendo la differenza tra il gestore di messaggi e un gestore delegante. Un gestore delegante è un gestore di messaggi e speravo solo che sarei stato in grado di utilizzare un gestore delegante al posto del gestore di messaggi e magicamente verrà eseguito nella pipeline OWIN come viene eseguito in una pipeline dell'API Web e apparentemente non è possibile , basato sulla risposta di Kiran. Sono d'accordo che sono troppo ambizioso. Grazie per aver guardato la mia domanda. – Badri

risposta

1

Sì, questa esperienza deve essere migliorata in quanto l'eccezione viene silenziosamente ignorata.

per lo scenario di cui sopra, si avrebbe bisogno di derivare da HttpMessageHandler invece DelegatingHandler come gestore delegante avrebbe cercato di delegare la richiesta ai gestori dopo che (ad esempio: L'eccezione menziona Message=The inner handler has not been assigned).

Ad esempio, il seguente dovrebbe funzionare:

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

E per la creazione di una catena di gestori, si potrebbe procedere come segue:

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

Grazie, questo chiarisce un po '. Un'ultima domanda. È possibile trasformare 'HttpMessageHandler' in un middleware OWIN usando l'adattatore? Speravo che avremmo potuto qualcosa del genere anche per i delegati. Nel mio caso, devo anche dare un'occhiata al messaggio di risposta. – Badri

+0

Capisco. Per maggiore chiarezza, le due estensioni 'UseWebApi' collegano un' HttpServer' e l'estensione 'UseHttpMessageHandler' non la collega e offre le opzioni per costruire una pipeline come quella menzionata nel post. Ora venendo alla tua domanda su come guardare la risposta, penso che avresti bisogno di collegare un middleware OWIN generale in cui puoi controllare la risposta e non un HttpMessageHandler. La pipeline della richiesta sarebbe quindi: '-> MyOwinInspectorMiddleware-> HttpMessageHandlerAdapter-> HttpServer (HandlerA -> HanlerB -> etc)' –

+0

@KiranChalla Ciao, dov'è l'estensione "UseHttpMessageHandler'? Non riesco a trovarlo nella fonte Katana. – Aliostad

Problemi correlati