11
votes

Utilisation de personnalisées IHTTPACTIONInvoker dans Web API pour une manipulation des exceptions

J'essaie d'ajouter une application IHTTPACACKInvoker personnalisée à mon application WebAPI afin d'empêcher la nécessité de beaucoup de code de traitement d'exception répété dans mes méthodes d'action.

Il ne semble pas vraiment y avoir beaucoup de choses sur la façon dont Pour faire cela autre que Cet article . Après avoir écrit mon IHTTPACACTInvoker selon l'article, j'ai ajouté ce code: p> xxx pré>

dans une méthode de mon fichier global.asax. Maintenant, lors de l'exécution d'un appel à mon API, j'obtiens l'exception suivante sur la méthode Supprimer (): P>

The service type IHttpActionInvoker is not supported


0 commentaires

3 Réponses :


1
votes

Avez-vous envisagé d'enregistrer un filtre d'exception à la place? Voici quelques documents à ce sujet:

http: // www. asp.net/web-api/overview/web-api-Rutting-and-actions/Exception-Handling

Vous ne devriez pas avoir à tomber à la couche d'invocateur d'action si tout ce que vous voulez faire est de gérer certaines exceptions d'une manière particulière.


1 commentaires

Un grand nombre des exceptions que les développeurs veulent capturer sont transformés en un HttpResponseException par l'API Web. Cette exception est avalée bien avant que les filtres d'exception sont invoquées, donc un filtre d'exception mondiale ne va pas tout de capture.



7
votes

J'ai subi la même erreur que vous décrivez lorsque vous essayez de supprimer le service.

J'ai découvert que je n'avais rien eu besoin de supprimer de la configuration globale, comme il apparaît si vous avez enregistré l'interface dans votre conteneur, puis va résoudre ce premier.

Par exemple, j'utilise SimpleIjector et dans mon global.aSax, j'ai ceci: xxx

au moment de l'exécution, il est Résolution de la dépendance de MyapicontrollerAckInvokerInvoyardInvoiffée Lorsque nécessaire.

Vous pouvez ensuite effectuer une manipulation des exceptions dans votre client ActionInvoker et toutes les dépendances définies dans votre constructeur seront effectuées correctement. La raison pour laquelle je cherchais l'actionInvoker était d'obtenir l'injection du constructeur, car l'injection en attributs semble nécessiter une injection de propriété.

aussi plutôt que la suppression / insert, le remplacement semble fonctionner. (dans global.asax) xxx


0 commentaires

0
votes

Quant à moi, cela fonctionne avec IactionInvoker au lieu d'IHTTPACACTIONNvoker. Si je comprends bien, IHTTPACACTIONInvoker est utilisé pour les appels ASYNC API, n'est-ce pas?

public class RepControllerActionInvoker : ControllerActionInvoker
{
    ILogger _log;

    public RepControllerActionInvoker()
        : base()
    {
        _log = DependencyResolver.Current.GetService<ILogger>();
    }

    public override bool InvokeAction(ControllerContext controllerContext, string actionName)
    {
        try
        {
            return base.InvokeAction(controllerContext, actionName);
        }
        catch (Exception e)
        {
            _log.Error(e);
            throw new HttpException(500, "Internal error");
        }
    }
}


0 commentaires