/ / ActionAttributeFilter vs. Delegatinghandler - avantages / inconvénients? - asp.net-web-api2

ActionAttributeFilter vs. Delegatinghandler - avantages / inconvénients? - asp.net-web-api2

Je veux enregistrer les données JSON entrantes de la demande et les json sortantes en réponse.

Après quelques recherches, j'ai remarqué que l'on pouvait utiliser à la fois ActionAttributeFilter et DelegatingHandler personnalisés. Sont-ils des avantages / inconvénients?

Réponses:

12 pour la réponse № 1

Avantages / inconvénients dépend de votre besoin.

Le gestionnaire de délégation est beaucoup plus élevé dans la hiérarchie desDemande de traitement API Web qu'ActionAttributeFilter. Si vous implémentez le gestionnaire de délégation, vous créez un gestionnaire de messages, tandis que si vous créez un filtre d'action, vous créez un filtre qui s'exécute juste avant la méthode d'action dans le pipeline.

Bien qu'un gestionnaire de messages s'exécute plus tôt dans lapipeline, il peut être avantageux de traiter demandes dès que possible. Le gestionnaire de messages s'exécute pour toutes les méthodes d'action, ou du moins pour toutes les méthodes d'action d'un itinéraire. Ceci doit être pris en compte lors de la sélection du gestionnaire de messages pour résoudre un problème. Les filtres d'action peuvent être appliqués à des méthodes d'action individuelles, à toutes les méthodes d'un contrôleur ou à toutes les méthodes de tous les contrôleurs. configurer le filtre en tant que filtre global.


2 pour la réponse № 2

Pour répondre à vos besoins particuliers, c’est-à-dire enregistrer une demande et une réponse, vous devez utiliser un gestionnaire de délégation.

L'avantage de ceci est que vous pouvez créer un journalobjet de la demande ET la réponse en même temps. Cela est dû au fait que le gestionnaire de délégation tourne autour de la demande et de la réponse et aura donc accès aux deux.

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var log = new Log { Url = request.RequestUri };
var response = await base.SendAsync(request, cancellationToken);
log.ContentLength = response.ContentLength;
this.LogAsync(log);
return response;
}

Avec ActionFilter, vous pouvez avoir des méthodes qui s'exécuteront avant et après la demande, mais pas tout au long. Vous devrez donc penser à corréler les journaux d'une manière ou d'une autre.