2012-11-29 2 views
11

Ho scritto un gestore delegato personalizzato che aggiunge intestazioni personalizzate alla risposta & controlli nella richiesta.Gestore delegazione personalizzato specifico per un controller nell'API Web ASP.NET

ho aggiunto le maniglie in configurazione WebAPI

config.MessageHandlers.Add(new customHandler());

Ma la questione è vale per tutti i controllori. Devo applicare un'intestazione personalizzata specifica a un controller. È possibile aggiungere gestori personalizzati specifici per un controller?

risposta

15

Alla fine di questo articolo viene spiegato come applicare gli handler solo a determinati percorsi: http://www.asp.net/web-api/overview/working-with-http/http-message-handlers. Potrebbe essere necessario creare un gestore univoco per il controller affinché si applichi solo a quel controller.

config.Routes.MapHttpRoute(
     name: "MyCustomHandlerRoute", 
     routeTemplate: "api/MyController/{id}", 
     defaults: new { controller = "MyController", id = RouteParameter.Optional }, 
     constraints: null, 
     handler: HttpClientFactory.CreatePipeline(new HttpControllerDispatcher(config), new MyCustomDelegatingMessageHandlerA()); 
    ); 

per quanto riguarda come la pipeline di per-percorso gestori di messaggi sarebbe simile, si può guardare here.

+0

Grazie per il link, è davvero evidente. – user1135534

+0

@ kiran-challa e Nick, Come avere lo stesso funzionamento con "Attribute Routing"? È possibile? –

+0

collegamento morto nell'ultima frase –

5

Quello che puoi fare è utilizzare il gestore di messaggi per route, ma fai attenzione qui. Poiché l'articolo che @Nick ha collegato nella sua risposta, è possibile concatenare il gestore e assicurarsi che sia coinvolto lo HttpControllerDispatcher. Altrimenti, non entrerai nella pipeline del Controller.

Un altra opzione che mi piace è quello di utilizzare la HttpControllerDispatcher come classe base per il vostro gestore personalizzato:

public class CustomerOrdersDispatcher : HttpControllerDispatcher { 

    public CustomerOrdersDispatcher(HttpConfiguration config) 
     : base(config) { 
    } 

    protected override Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) { 

     // Do some stuff here... 

     return base.SendAsync(request, cancellationToken); 
    } 
} 

Qui, come si intende registrarlo:

protected void Application_Start(object sender, EventArgs e) { 

    var config = GlobalConfiguration.Configuration; 

    config.Routes.MapHttpRoute(
     name: "CustomerOrdersHttpRoute", 
     routeTemplate: "api/customers/{customerKey}/orders/{key}", 
     defaults: new { controller = "CustomerOrders", key = RouteParameter.Optional }, 
     constraints: null, 
     handler: new CustomerOrdersDispatcher(config) 
    ); 

    config.MessageHandlers.Add(new SomeOtherHandler1()); 
    config.MessageHandlers.Add(new SomeOtherHandler2()); 
} 

Dopo SomeOtherHandler1 e SomeOtherHandler2 vengono eseguiti, il tuo CustomerOrdersDispatcher verrà eseguito per il percorso CustomerOrdersHttpRoute. Quindi, puoi vedere che mantieni il comportamento predefinito del gestore e imposta alcuni gestori globali mentre ne hai uno specifico.

Ecco la piena implementazione del mio CustomerOrdersDispatcher: https://github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.cs.

E 'possibile visualizzare il codice sorgente dell'applicazione di esempio completo, come pure per vedere come va a finire: https://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample