2012-06-20 16 views
39

Sembra che questi due abbiano uno scopo simile. Sarebbe bello vedere alcuni esempi quando utilizzare l'uno sull'altro, pro e contro, oltre a sottolineare quali sono le principali differenze.Quando utilizzare HttpMessageHandler vs ActionFilter?

+1

http://forums.asp.net/t/1804456.aspx – user960567

+3

Una domanda migliore potrebbe essere quando utilizzare HttpMessageHandler vs un ActionFilter * globale *. Sembra un po 'più confuso. I filtri –

risposta

53

La principale differenza tra i due è la messa a fuoco. Messaggio I gestori sono applicati a tutte le richieste HTTP. Eseguono la funzione di un intermediario HTTP. I filtri si applicano solo alle richieste che sono inviate al particolare controller/azione in cui è applicato il filtro .

È necessario utilizzare MessageHandlers quando si desidera che il comportamento sia applicato alla maggior parte delle richieste. I filtri devono essere utilizzati quando sono applicabili solo a determinate risorse.

enter image description here

+6

possono anche essere applicati a tutte le richieste HTTP, se aggiunti come filtri globali. – frennky

+2

Da dove viene questo? –

+2

http://blogs.msdn.com/b/kiranchalla/archive/2012/05/05/asp-net-mvc4-web-api-stack-diagram.aspx –

26

Una grande differenza tra gestori e filtri azione è la fase in cui vengono eseguiti. I filtri di azione vengono eseguiti dopo l'invio del controller e l'associazione del modello, pertanto è possibile interagire con l'istanza del controller che gestisce la richiesta e avere accesso diretto agli oggetti del modello tipizzati che vengono passati al metodo di azione. Ho utilizzato questo approccio per eseguire la registrazione avanzata dei valori di richiesta/risposta: poiché sono riuscito ad accedere al controller, sono stato in grado di registrare informazioni aggiuntive su come è stata gestita la richiesta.

gestori di messaggi vengono eseguite in precedenza nel processo, e funzionano molto più vicino ai valori richiesta greggio/risposta di filtri (contrastare gli oggetti HttpRequestMessage/HttpResponseMessage utilizzati nei gestori con la tanto ricco HttpActionContext e HttpActionExecutedContext oggetti disponibili all'interno di filtri). Ciò li rende potenzialmente più efficienti per alcune attività, ad esempio, se si sta tentando di determinare se è necessario interrompere anticipatamente la richiesta. Se sai che la richiesta deve essere rifiutata, un gestore ti consentirà di farlo prima che l'infrastruttura WebApi si sia impegnata a creare un'istanza del controller, eseguendo il binding del modello ecc.

Un'altra differenza è che i gestori sono concatenati e che hai più controllo su come viene eseguita la catena. Sebbene i filtri vengano richiamati in sequenza, l'impostazione della risposta in un filtro terminerà effettivamente la richiesta, impedendo l'esecuzione del successivo filtro nell'elenco. Ad esempio, se si dispone di un primo filtro che restituisce una richiesta errata se il modello è nullo e un secondo filtro per registrare la richiesta, il secondo filtro non verrà eseguito una volta generata la cattiva richiesta dal primo filtro. Con un gestore, sarebbe comunque possibile (anche se non necessariamente consigliabile!) Chiamare il gestore interno e consentire alla catena di gestione di operare normalmente.

Problemi correlati