2012-04-12 14 views

Antwort

15

Eine Option wäre, ein benutzerdefiniertes ExceptionFilterAttribute einzurichten, die OnException-Methode zu überschreiben und Elmah von dort aus zu signalisieren. Siehe das Beispiel unten stehenden Link

Elmah WebAPI Sample

+0

Das, was ich mit gekämpft (und immer noch nicht die Zeit zu adressieren gefunden) wird mit Formularauthentifizierung auf meinem Elmah Zugang gemischt mit grundlegenden auth auf meinem api –

+1

@AntonyScott haben Sie sich bei [MADAM ] (http://www.raboof.com/projects/madam/)? –

8

für ASP.NET Web API die Elmah.MVC nuget Paket, deren Einzelheiten verwenden sind unten angegeben

Entnommen: HOW TO SETUP ELMAH.MVC WITH ASP.NET MVC 4 ?

Was ist Elmah ?

ELMAH ist ein Open Source-Projekt, dessen Zweck darin besteht, unbehandelte Ausnahmen in ASP.NET-Webanwendungen zu protokollieren und zu melden.

Warum Elmah verwenden?

ELMAH dient als ein unauffälliger Abfangmechanismus von unbehandelten ASP.NET-Ausnahmen, die normalerweise mit dem ASP.NET yellow screen of death manifestieren.

So jetzt wissen wir, was und warum Elmah verwenden, Lets schnell beginnen, wie Sie Elmah mit Ihrem ASP.NET MVC-Projekt verwenden.

Schritt 1: rechts auf Ihrer Lösung klicken und die Option "Nuget Pakete verwalten" Option enter image description here

Schritt 2: Im Nuget Package Manager Suche nach "Elmah" und installieren Sie die Elmah.MVC nuget Erweiterung. enter image description here Der Nuget Package Manager lädt die erforderlichen DLLs herunter und fügt sie hinzu und ändert die <appSetting> von web.config für Elmah zu wo enter image description here rk.

Schritt 3: Das wars !! Deine Elmah ist jetzt bereit zu testen. Ich habe einen 404 erzeugt, um zu prüfen, ob mein Elmah funktioniert, auf ELMAH kann durch diese URL zugegriffen werden: http://yourapp.com/elmah. enter image description here enter image description here

this helps :)

Weiterführende Literatur:

+4

Und generieren Sie das 404 von einem 'ApiController'? Wenn nicht, und es ist ein Standard-MVC-Controller, haben Sie den Punkt der Frage vollständig verpasst. –

+0

Habe 404 von einem normalen Controller generiert, dies ist nur ein Beispiel, das selbe wäre der Fall, wenn ich den Webapi-Controller benutzt und einen 404 erzeugt hätte. – Yasser

+12

Hast du es tatsächlich ausprobiert? Weil ich mir ziemlich sicher bin, dass das nicht der Fall ist. Die Ausnahmebehandlung funktioniert in der Web-API anders. –

9

die unter URL Prüfen Sie es im Detail beschreiben, wie mit Web-API verwenden Elmah:

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

Sie können auch unter den NuGet Paket verwenden:

Install-Package Elmah.Contrib.WebApi 

Verbrauch:

Registrieren Sie sie einfach während des Starts Ihrer Anwendung oder Controller für Controller.

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

    ... 
} 

(von the Elmah.Contrib.WebApi GitHub repo)

18

Es gibt zwei Optionen, die von ELMAH mit Ausnahmen in Web-API zu erfassen.

Wenn Sie Fehler erfassen möchten, die in Aktionen und Controller auftreten, d. H. In Ihrer Geschäftslogik können Sie ein ActionFilterAttribute erstellen und diese Ausnahmen zu ELMAH protokollieren.

Beispiel:

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

Dann wireup durch diese Filter hinzugefügt wird.

  • Ausnahmen vom Controller Konstrukteurs geworfen:

    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()); 
        } 
    } 
    

    Mit dem obigen Ansatz folgenden Fehlern werden nicht behandelt.

  • Ausnahmen, die von Nachrichtenhandlern ausgelöst werden.
  • Ausnahmen beim Routing ausgelöst.
  • Ausnahmen während der Antwortinhalt Serialisierung geworfen

Referenz: 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

für ELMAH Um WEB-API-Fehler auf globaler Ebene, so dass alle 500 Server Fehler dann dies tun gefangen loggt :

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

Fügen Sie die unten an WebApiConfig

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

Und wenn Sie benutzerdefinierte Fehlermeldungen für die 500 Server Fehler zeigen möchten, können Sie die neue Exception in Web Api implementieren (Beachten Sie, dass ExceptionLogger und Exception unterschiedlich sind.)

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); 
     } 
    } 
} 

Referenz: http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

+0

Danke Kumpel, das war hilfreich. Ich kratzte mich immer noch ein bisschen am Kopf, bis ich herausfand, wie ich es in meiner Situation zum Laufen bringen kann (wo der WebApi auch im Kontext einer MVC-Site läuft); Die Antwort war einfach, auch das Elmah.MVC-Paket zu installieren. Ich erweitere das etwas auf meinem Blogpost hier: http://dbarrowstechblog.blogspot.co.uk/2015/03/elmah-aspnet-webapi-tip.html –

+0

Die erste (einfache) Lösung, die 'Elmah.ErrorLog direkt aufruft .GetDefault (HttpContext.Current) .Log' funktioniert gut, aber es sendet keine E-Mail (wenn Sie Elmah so eingerichtet haben) - es wird nur protokolliert. Wenn Sie möchten, dass Ihre Ausnahme von Elmah in der Weise behandelt wird, die Sie in web.config angegeben haben, würde ich vorschlagen, den .Log-Aufruf durch Elmah.ErrorSignal.FromCurrentContext() zu ersetzen. Raise (context.Exception); Auslöser der normalen Elmah-Behandlung. – Greg