Je veux mettre en place la gestion des exceptions dans un composant middleware, quelque chose comme ceci :
public override async Task Invoke(IOwinContext context)
{
try
{
await Next.Invoke(context);
}
catch (Exception ex)
{
// Log error and return 500 response
}
}
Cependant, certaines des exceptions que je voudrais attraper sont attrapées et converties en HttpErrorResponse
par le pipeline de l'API Web avant que je puisse les atteindre. Au cours de ce processus, je perds beaucoup de détails sur les erreurs, et je ne peux donc pas obtenir de traces de pile utiles pour le débogage, etc. (le débogueur ne s'arrête même pas lorsque l'exception est levée - je dois parcourir manuellement le code et voir où il échoue...).
J'ai essayé d'ajouter un gestionnaire d'exception personnalisé avec l'implémentation suivante :
public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
var owinContext = context.Request.GetOwinContext();
owinContext.Set(Constants.ContextKeys.Exception, context.Exception);
return Task.FromResult(0);
}
enregistré par config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());
dans ma configuration de démarrage, mais en le regardant après avoir exécuté Next.Invoke(context)
par le biais de
context.Get<Exception>(Constants.ContextKeys.Exception);
toujours ne me donne pas tous les détails que je souhaite, et ne parvient pas non plus à s'arrêter au point de défaillance avec le débogueur.
Y a-t-il un moyen pour que je puisse complètement éteindre tous une gestion intégrée des erreurs, de sorte que mon propre intergiciel puisse s'en charger ?
Clarification puisque beaucoup de gens semblent ne pas comprendre ce que je cherche :
- La gestion intégrée des erreurs dans l'API Web permet d'attraper un peu de (mais pas toutes) les exceptions et les réécrit en 500 réponses.
- Je veux attraper tous les exceptions, la journalisation, et puis émettre 500 réponses avec les informations que je choisis (pour la plupart d'entre eux, voir le point suivant).
- Il y a aussi quelques exceptions qui signalent des erreurs de logique commerciale, pour lesquelles je veux renvoyer des erreurs 40x à la place.
- Je veux que ce soit au sommet du pipeline (de l'application), c'est-à-dire que cela enveloppe tout à un autre moment du cycle de vie de la demande
- Je veux gérer cela en utilisant OWIN, pour le rendre portable à un éventuel scénario futur d'auto-hébergement (c'est-à-dire qu'il n'est pas écrit dans la pierre que cette application sera toujours hébergée sur IIS - les modules HTTP, Global.asax.cs et autres ne sont pas pertinents ici).