2012-04-12 14 views

Odpowiedz

15

Jedną opcją byłoby ustawienie niestandardowego ExceptionFilterAttribute, zastąpienie metody OnException i wysłanie stamtąd Elmah. Zobacz przykładowy link poniżej

Elmah WebAPI Sample

+0

rzecz Walczyłem z (i nadal nie znalazłem czasu, aby adres) jest posiadanie uwierzytelniania formularzy na mojej dostępu ELMAH zmieszanego z podstawowego uwierzytelniania na moim api –

+1

@AntonyScott pan spojrzał na [MADAM ] (http://www.raboof.com/projects/madam/)? –

8

dla ASP.NET Web API użyć pakietu Elmah.MVC Nuget, których szczegóły podano poniżej

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

Co jest ELMAH ?

ELMAH to projekt typu open source, którego celem jest rejestrowanie i zgłaszanie nieobsługiwanych wyjątków w aplikacjach internetowych ASP.NET.

Dlaczego warto korzystać z Elmah?

ELMAH służy jako dyskretny kolektora nieobsłużonych wyjątków ASP.NET, te zwykle manifestującej z ASP.NET yellow screen of death.

Teraz wiemy już, co i dlaczego warto używać Elmah, Zacznijmy od szybkiego korzystania z Elmah w projekcie ASP.NET MVC.

Krok 1: prawym przyciskiem myszy na rozwiązania i wybrać opcję enter image description here

Step 2 "Zarządzanie Nuget pakiety": W poszukiwaniu menedżera Nuget Pakiet dla "ELMAH" i zainstalować Nuget rozszerzenie Elmah.MVC. Menedżer pakietów Nuget pobierze i doda wymagane biblioteki DLL i zmodyfikuje plik web.config: <appSetting> dla Elmah na wo enter image description here rk.

Krok 3: To wszystko !! Twoja Elmah jest teraz gotowa do sprawdzenia. Wygenerowałem 404 do sprawdzenia, czy moja Elmah działa, dostęp do ELMAH można uzyskać pod tym adresem: http://yourapp.com/elmah. enter image description here enter image description here

Nadzieja to pomaga :)

Dalsze informacje:

+4

Czy generujesz 404 z "ApiController"? Jeśli nie, a jest to standardowy kontroler MVC, całkowicie pomijałeś punkt pytania. –

+0

Wygenerowałem 404 ze zwykłego kontrolera, to tylko przykład, to samo by miało miejsce, gdybym użył kontrolera webapi i spowodował 404. – Yasser

+12

Czy próbowałeś tego? Ponieważ jestem prawie pewien, że tak nie jest. Obsługa wyjątków działa inaczej w Web API. –

9

Sprawdź poniższy adres URL to opisać w szczegółach jak używać ELMAH z Web API:

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

Można również skorzystać z poniższego pakietu Nuget:

Install-Package Elmah.Contrib.WebApi 

Zastosowanie:

Po prostu zarejestruj się podczas uruchamiania aplikacji lub na zasadzie kontrolera.

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

    ... 
} 

(od the Elmah.Contrib.WebApi GitHub repo)

18

Istnieją dwie opcje przy użyciu ELMAH do przechwytywania wyjątków w Web API.

Jeśli chcesz przechwycić błędy , które występują w Actions i Controllers, tzn. W logice biznesowej możesz utworzyć ActionFilterAttribute i zarejestrować te wyjątki w ELMAH.

przykład:

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

Następnie wireup dodając ten filtr.

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

Z powyższego podejścia następujące błędy nie będą obsługiwane:

  • wyjątki generowane z konstruktorów kontrolera.
  • Wyjątki generowane przez komunikatory.
  • Wyjątki zgłaszane podczas routingu.
  • wyjątki rzucane podczas zawartości odpowiedź serializacji

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

Aby ELMAH do zalogowania błędy Web API na poziomie globalnym tak, że wszystkie 500 błędy serwera zostały złowione następnie to zrobić :

Install Nuget: https://www.nuget.org/packages/Elmah.Contrib.WebApi/

Dodaj poniżej, aby WebApiConfig

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

A jeśli chcesz pokazać niestandardowych komunikatów o błędach dla błędów 500 Server można wdrożyć nową ExceptionHandler w Web API (Zauważ, że ExceptionLogger i ExceptionHandler są różne.)

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

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

+0

dzięki mate, to było pomocne. Nadal drapałem sobie głowę przez chwilę, dopóki nie zorientowałem się, jak to zrobić w mojej sytuacji (gdzie WebApi działa również w kontekście strony MVC); odpowiedzią było po prostu zainstalowanie pakietu Elmah.MVC. Rozwijam się nieco na moim blogu tutaj: http://dbarrowstechblog.blogspot.co.uk/2015/03/elmah-aspnet-webapi-tip.html –

+0

Pierwsze (proste) rozwiązanie, które bezpośrednio wywołuje 'Elmah.ErrorLog .GetDefault (HttpContext.Current) .Log' działa dobrze, ale nie wysyła wiadomości e-mail (jeśli masz skonfigurowaną Elmah) - to się po prostu loguje. Jeśli chcesz, aby Twój wyjątek był obsługiwany przez Elmah w sposób określony w web.config, to sugerowałbym zastąpienie wywołania .Log za pomocą 'Elmah.ErrorSignal.FromCurrentContext(). Raise (context.Exception);' który będzie wywołać normalną obsługę Elmah. – Greg

Powiązane problemy