web-dev-qa-db-fra.com

Comment configurer Elmah avec l'API Web ASP.NET

J'ai essayé de nombreux nugets elmah mais ils ne fonctionnaient pas avec l'API Web ASP.NET. Est-ce que quelqu'un sait pourquoi? Y a-t-il un moyen de contourner cela?

36
user1327991

Il existe deux options en utilisant ELMAH pour capturer les exceptions dans l'API WEB.

Si vous souhaitez capturer les erreurs rencontrées dans les actions et les contrôleurs , c'est-à-dire que dans votre logique métier, vous pouvez créer un ActionFilterAttribute et consigner ces exceptions dans ELMAH.

exemple:

public class UnhandledExceptionFilter : ExceptionFilterAttribute {
    public override void OnException(HttpActionExecutedContext context) {
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(context.Exception));
    }
}

Ensuite, câbler en ajoutant ce filtre.

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Filters.Add(new UnhandledExceptionFilter());
    }
}

Avec l'approche ci-dessus, les erreurs suivantes ne seront pas traitées:

  • Exceptions levées par les constructeurs de contrôleurs.
  • Exceptions levées par les gestionnaires de messages.
  • Exceptions levées lors du routage.
  • Exceptions levées lors de la sérialisation du contenu de la réponse

Référence: http://blogs.msdn.com/b/webdev/archive/2012/11/16/capturing-unhandled-exceptions-in-asp-net-web-api-s-with-elmah. aspx & http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

Pour qu'ELMAH enregistre les erreurs de l'API WEB au niveau global de sorte que les 500 erreurs de serveur soient détectées, procédez comme suit:

Installez nuget: https://www.nuget.org/packages/Elmah.Contrib.WebApi/

Ajoutez ce qui suit à WebApiConfig

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...
        config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());
        ...
    }
}

Et si vous souhaitez afficher des messages d'erreur personnalisés pour les erreurs 500 Server, vous pouvez implémenter le nouveau ExceptionHandler dans Web Api (notez que ExceptionLogger et ExceptionHandler sont différents.)

class OopsExceptionHandler : ExceptionHandler
{
    public override void HandleCore(ExceptionHandlerContext context)
    {
        context.Result = new TextPlainErrorResult
        {
            Request = context.ExceptionContext.Request,
            Content = "Oops! Sorry! Something went wrong." +
                      "Please contact [email protected] so we can try to fix it."
        };
    }

    private class TextPlainErrorResult : IHttpActionResult
    {
        public HttpRequestMessage Request { get; set; }

        public string Content { get; set; }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            HttpResponseMessage response = 
                             new HttpResponseMessage(HttpStatusCode.InternalServerError);
            response.Content = new StringContent(Content);
            response.RequestMessage = Request;
            return Task.FromResult(response);
        }
    }
}

Référence: http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

23
jaxxbo

une option serait de configurer un ExceptionFilterAttribute personnalisé, de remplacer la méthode OnException et de signaler Elmah à partir de là. Voir l'exemple de lien ci-dessous

Exemple Elmah WebAPI

15
cecilphillip

Vérifiez l'URL ci-dessous qu'elle décrit en détail comment utiliser elmah avec l'API Web:

http://blogs.msdn.com/b/webdev/archive/2012/11/16/capturing-unhandled-exceptions-in-asp-net-web-api-s-with-elmah.aspx

Vous pouvez également utiliser le package NuGet ci-dessous:

Install-Package Elmah.Contrib.WebApi

Usage:

Enregistrez-le simplement lors du démarrage de votre application, ou contrôleur par contrôleur.

protected void Application_Start()
{
    GlobalConfiguration.Configuration.Filters.Add(new ElmahHandleErrorApiAttribute());

    ...
}

(à partir de le repo Elmah.Contrib.WebApi GitHub )

12
Ahmed Ahmed

Pour l'API Web ASP.NET, utilisez le package nuget Elmah.MVC , dont les détails sont donnés ci-dessous

Tiré de: COMMENT CONFIGURER ELMAH.MVC AVEC ASP.NET MVC 4?

Qu'est-ce que Elmah?

ELMAH est un projet open source dont le but est de consigner et de signaler les exceptions non gérées dans les applications Web ASP.NET.

Pourquoi utiliser Elmah?

ELMAH sert d'intercepteur discret des exceptions ASP.NET non gérées, celles qui se manifestent généralement avec ASP.NET écran jaune de la mort .

Alors maintenant, nous savons quoi et pourquoi utiliser Elmah, permet de commencer rapidement à utiliser Elmah avec votre projet ASP.NET MVC.

Étape 1: Faites un clic droit sur votre solution et sélectionnez l'option "Gérer les packages Nuget" enter image description here

Étape 2: Dans le gestionnaire de paquets Nuget, recherchez "Elmah" et installez l'extension Elmah.MVC nuget. enter image description here Le gestionnaire de paquets Nuget téléchargera et ajoutera les DLL requises et modifiera le <appSetting> Du web.config pour qu'Elmah fonctionneenter image description hererk.

Étape 3: C'est tout !! Votre Elmah est maintenant prêt à être testé. J'ai généré un 404 pour tester si mon Elmah fonctionne, ELMAH est accessible par cette URL: http://yourapp.com/elmahenter image description hereenter image description here

J'espère que cela t'aides :)

Lectures complémentaires:

6
Yasser Shaikh