Application_Error mondiale.asax pas la capture des erreurs dans WebAPI
Pour un projet que je suis en train de travailler sur, l'une des choses que nous mettons en œuvre est quelque chose que nous avons de code dans certains de mes anciennes équipes ASP.NET et les projets MVC - un Application_Error
exception catcher qui envoie un e-mail à l'équipe de développement à l'exception de l'expérience et de la plupart des détails pertinents.
Voici à quoi il ressemble:
Mondiale.asax:
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
string path = "N/A";
if (sender is HttpApplication)
path = ((HttpApplication) sender).Request.Url.PathAndQuery;
string args = string.Format("<b>Path:</b> {0}", path);
//Custom code that generates an HTML-formatted exception dump
string message = Email.GenerateExceptionMessage(ex, args);
//Custom code that sends an email to the dev team.
Email.SendUnexpectedErrorMessage("Some App", message);
}
Un "petit" problème, mais lorsque j'ai intentionnellement une partie de code de lever une exception afin de tester ce mécanisme...
public static void GetMuffinsByTopping(string topping)
{
throw new Exception("Test Exception!", new Exception("Test Inner Exception!!!"));
//Actual repository code is unreachable while this test code is there
}
Le front-end JavaScript est immédiatement interception d'un HTTP 500 demande, mais le mondial.asax.cs code indiqué ci-dessus n'est pas atteint (j'ai mis un point d'arrêt sur la première exécution de la ligne de la méthode.)
Question: De quelle façon puis-je obtenir le "vieux" Application_Error
gestionnaire de l'expédition d'erreur e-mails, de sorte que notre équipe de développeurs peut plus facilement debug notre application?
- Vous pourriez résumé de votre gestion des erreurs de logique dans une méthode distincte que
Application_Error
appels, envelopper le Web API corps de la méthode dans un try/catch, puis manuellement passer l'erreur logique de l'abstraction de la méthode de Web les erreurs de l'API. Pas de la façon la plus propre, j'en suis sûr, mais il devrait être très simple à mettre en œuvre et "fonctionne". Pour une méthode plus propre que vous pourriez regarder la gestion des exceptions dans ASP.NET l'API Web. - Je suis d'accord que c'est une bonne "juste le faire fonctionner" suggestion. La raison pour laquelle je demande c'est que d'avoir un
try/catch
dans chaque méthode de l'API est en fait ce que je suis en train de sortir de, par ma tech responsable de l'orientation. Si tout le reste échoue, notre équipe peut l'utiliser comme une solution de repli, si. Il sera juste très désagréable modèle. - J'ai édité mon dernier commentaire. Regarde le lien que j'ai fourni, et un coup d'oeil à l'exception des filtres. Qui ressemble à une manière décente pour éviter d'avoir try/catch dans toutes vos API Web le corps de méthode.
- Que la liquidation de travail pour moi. Pourriez-vous faire une réponse de votre commentaire que l'utilisation d'un Filtre d'Exception est une meilleure façon de le faire?
Vous devez vous connecter pour publier un commentaire.
Abstraction de votre erreur de logique de traitement de
Application_Error
dans sa propre fonction. Créer un L'API Web de filtre d'exception.Erreurs de l'API Web de ne pas déclencher l'événement Application_Error. Mais on peut créer un filtre d'exception, et de l'inscrire à traiter les erreurs. Voir aussi Mondial de la gestion d'Erreurs ASP.NET Web API 2.
Application_Start
, parce que vous êtes à l'enregistrement du filtre de sorte qu'il sait comment gérer l'erreur quand il arrive. Tu avais toujours enregistrer un filtre au démarrage de l'application.public class LogExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext context) { ErrorLogService.LogError(context.Exception); } }
ExceptionFilter
et l'enregistrement de ce service à l'échelle mondialeconfig.Services.Add(typeof(IExceptionLogger), new TraceExceptionLogger());
?Dans mon cas, je préfère ne pas utiliser le Web.config. Puis j'ai créé le code ci-dessus dans le Mondial.asax fichier:
Et thtat est mon ErrorController.cs
Et c'est mon ErrorLogService.cs copyed de @mason classe