Résumé de l'expérience de gestion des exceptions de l'API Web Asp.Net

PHPz
Libérer: 2017-04-04 15:44:57
original
2411 Les gens l'ont consulté

Dans le tutoriel précédent, je vous ai présenté le développement et l'utilisation de Filtre dans l'API Web En parlant d'ExceptionFilter, il y avait un écueil : ExceptionFilter ne peut intercepter et traiter que les événements qui se produisent lors de l'exécution de l'action. Exception, si une exception se produit en dehors du processus d'exécution de l'action, ExceptionFilter est impuissant.

Ces exceptions incluent :

1. Exceptions qui se produisent dans la méthode de construction du contrôleur

2. Exceptions qui se produisent dans les gestionnaires de messages

3. Exceptions qui se produisent pendant le processus de routage Exceptions

4. Exceptions qui se produisent pendant le processus de sérialisation/désérialisation de Body

On peut voir que ExceptionFilter ne peut résoudre que les exceptions qui se produisent après l'instanciation réussie de l'ApiControler et lors de l'exécution d'Action.Exceptions ; afin de résoudre ce problème, en plus d'ExceptionFilter, deux points d'extension pour l'enregistrement et le traitement des exceptions sont introduits dans l'API WEB :

IExceptionLogger et IExceptionHandler.

et ces deux extensions sont enregistrées et gérées en tant que composants de pipeline de l'API Web, et elles ont une division du travail différente :

IExceptionLogger en tant que composant d'enregistrement de journal anormal, qui est responsable du journal après des anomalies. L'enregistrement s'effectue tout au long du cycle de vie de l'API Web. Dans le cadre de l'API Web, toute exception non interceptée/gérée dans n'importe quel cycle de demande entrera d'abord dans le pipeline de journalisation des exceptions pour l'enregistrement du journal des exceptions. Dans l'API Web, plusieurs instances de IExceptionLogger peuvent être enregistrées. être responsable de la gestion des différentes exceptions.

En tant que composant de gestion des exceptions, IExceptionHandler est responsable du traitement après que des exceptions se produisent. Il se trouve à la fin du pipeline de gestion des exceptions. Lorsque le composant IExceptionLogger termine un enregistrement et qu'il n'y a pas d'ExceptionoinFilter associé pour la gestion des exceptions. appellera enfin ExceptionHandler pour la gestion des exceptions. Dans l'API Web, il n'y a qu'un seul ExceptionHandler pour la gestion des exceptions.

Il existe deux classes de base dans le framework Web API : ExceptionLogger et ExceptionHandler. Lors de l'utilisation de la classe de base ExceptionLogger, elle fournit la méthode virtuelle ShouldLog. Cette méthode est appelée dans la classe de base et sa fonction est d'éviter The. la même exception est enregistrée à plusieurs reprises par la même instance d'ExceptionLogger (par exemple, lorsque l'exception est à nouveau levée dans le pipeline suivant, ou que le même objet ExceptionLogger est accidentellement enregistré deux fois, il existe une possibilité d'enregistrement répété. Nous pouvons également remplacer ShouldLog). Ajoutez notre propre logique de jugement d’enregistrement d’exception pour effectuer différents appels ExceptionLogger pour différents scénarios. Si vous êtes intéressé, vous pouvez décompiler la classe de base ExceptionLogger et y jeter un œil. Elle utilise l'implémentation de l'interface d'affichage, ce qui est une technique très intéressante. Regardons un exemple d'utilisation de ExceptionLogger :


    public class ErroLogger : ExceptionLogger
    {        public  async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken)
        {            var sb = new StringBuilder();            //获取Log组件
            ILogger log = LogManager.GetCurrentClassLogger();            var request = context.Request;

            sb.AppendLine("URL:");            //获取URL
            var url = request.RequestUri.ToString();
            sb.AppendLine(url);
           
            log.Error(context.Exception,sb.ToString(),"");
        }        public override bool ShouldLog(ExceptionLoggerContext context)
        {            return context.Exception is DemoException && base.ShouldLog(context);
        }
    }
Copier après la connexion
Dans cet exemple, nous réécrivons ShouldLog pour garantir que cet ExceptionLogger n'enregistre que les exceptions de type DemoException , et également. appelle la méthode de la classe de base pour garantir que la même exception ne sera pas enregistrée à plusieurs reprises. Dans la méthode LogAsync, j'ai enregistré l'URL de la demande qui a provoqué l'exception via le composant Log, ainsi que les informations sur l'exception.

Ensuite, nous devons enregistrer ce composant :

Écrivez


De cette manière, un composant d'enregistrement d'exception pour DemoException a été développé et enregistré Lorsqu'une DemoException non gérée se produit dans le pipeline d'exécution de l'API Web, ce composant sera appelé pour l'enregistrement.
config.Services.Add(typeof(IExceptionLogger),new ErroLogger());
Copier après la connexion

Ensuite, nous écrirons un ExceptionHandler. Dans l'ensemble du framework Web API, ExceptionHandler ne peut fournir qu'une seule instance. Comme ExceptionLogger, nous pouvons hériter de la classe de base ExceptionHandler pour simplifier la gestion des exceptions. déterminer si l'exception doit être gérée pour éviter de gérer de manière répétée les exceptions levées à plusieurs reprises par d'autres liens dans le pipeline. Nous fournissons également un exemple :


Dans cet exemple, nous déterminons le type d'exception et renvoyons différents contenus de réponse au client en fonction de différents statuts HTTP. codes.
    public class ErrorHandler : ExceptionHandler
    {        public override async Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
        {            if (context.Exception is DemoException)
            {
                context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.BadRequest,new {Message=context.Exception.Message}));
            }            else
            {
                context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError,new {Message = "服务器已被外星人绑架"}));
            }
        }
}
Copier après la connexion

Enregistrez ensuite ce module de gestion des exceptions dans la configuration, écrivez


dans la méthode Register du fichier App_Start/WebApiConfig.cs De cette façon Le Le gestionnaire d'exceptions par défaut du système a été remplacé et notre gestionnaire personnalisé peut être utilisé pour gérer les exceptions.
config.Services.Replace(typeof(IExceptionHandler),new ErrorHandler());
Copier après la connexion

Lors du processus d'enregistrement et de traitement des exceptions, nous rencontrons tous le paramètre de contexte d'exception correspondant. Nous pouvons utiliser ce paramètre pour obtenir le contexte de la requête en cours, obtenir la requête, la réponse (attention, parfois ce sera le cas). vide) et capture Nous pouvons utiliser ces informations pour mieux décrire, enregistrer et gérer les exceptions, telles que les informations du bloc catch de l'exception.

À ce stade, le développement simple du composant ExceptionLogger et du composant ExceptionHandler est terminé. Au cours du processus de développement, nous pouvons voir que ExceptionLogger est responsable de l'enregistrement des exceptions globales. ExceptionLogger capturera et enregistrera toutes les exceptions non gérées qui se produisent dans le cadre du pipeline de l'API Web. Les fonctions d'ExceptionHandler et d'ExceptionFilter se chevauchent, alors quand utiliser ExceptionHandler et quand utiliser ExceptionFilter ? Nous pouvons lister les différences entre les deux dans le tableau suivant :

 

ExceptionFilter

ExceptionHandler

作用域

ControllerAction

全局

实例个数

无限制

全局唯一

作用条件

Controller实例化成功之后

Web API成功加载之后

ExceptionFilter

ExceptionHandler
Portée Contrôleur, Action global
Nombre d'instances Illimité Unique au monde
Conditions d'action ContrôleurAprès une instanciation réussie API Web Après un chargement réussi
Après le tableau ci-dessus, nous pouvons voir que si la granularité du traitement est aussi détaillée que les niveaux du contrôleur et de l'action, ExceptionFilter sera plus facile à gérer. Il peut déjà localiser avec précision une certaine action, puis effectuer un développement personnalisé pour l'action actuelle. La portée d'ExceptionHandler est beaucoup plus grande que celle d'ExceptionFilter et présente plus d'avantages dans la gestion de la situation globale. C'est tout ce que j'ai à dire sur la gestion des exceptions de l'API Web. S'il y a des inexactitudes ou des questions dans l'article, vous pouvez me les signaler.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!