Domanda Gestore delegazione personalizzato specifico per un controller in API Web ASP.NET


Ho scritto un gestore delegato personalizzato che aggiunge intestazioni personalizzate alla risposta e ai controlli nella richiesta.

Ho aggiunto gli handle nella configurazione WebAPi

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

Ma il problema si applica a tutti i controller. Devo applicare un'intestazione personalizzata specifica a un controller. È possibile aggiungere gestori personalizzati specifici per un controller?


11
2017-11-29 15:59


origine


risposte:


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 l'aspetto della pipeline dei gestori di messaggi per route, puoi guardare Qui.


16
2017-11-29 16:08



Quello che puoi fare è usare il gestore di messaggi per route, ma fai attenzione qui. Come l'articolo che @Nick ha collegato nella sua risposta, puoi concatenare il gestore e assicurarti che il HttpControllerDispatcher è coinvolto. Altrimenti, non entrerai nella pipeline del Controller.

Un'altra opzione che mi piace è usare il HttpControllerDispatcher come classe base per il tuo 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);
    }
}

Ecco come lo registrerai:

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 sono eseguiti, i tuoi CustomerOrdersDispatcher sarà eseguito per CustomerOrdersHttpRoute itinerario. 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.

È possibile visualizzare il codice sorgente dell'applicazione di esempio completo per vedere come funziona: https://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample


5
2017-11-29 16:33