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); } }
config.Services.Add(typeof(IExceptionLogger),new ErroLogger());
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 :
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 = "服务器已被外星人绑架"})); } } }
Enregistrez ensuite ce module de gestion des exceptions dans la configuration, écrivez
config.Services.Replace(typeof(IExceptionHandler),new ErrorHandler());
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 | ||||||||||||
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 |
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!