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
Grazie per il link, è davvero evidente. – user1135534
@ kiran-challa e Nick, Come avere lo stesso funzionamento con "Attribute Routing"? È possibile? –
collegamento morto nell'ultima frase –