2012-04-12 13 views

risposta

15

Un'opzione sarebbe quella di impostare un ExceptionFilterAttribute personalizzato, sovrascrivere il metodo OnException e segnalare Elmah da lì. Vedere il link riportato di seguito

Elmah WebAPI Sample

+0

la cosa ho lottato con (e ancora non ho trovato il tempo per rispondere) sta avendo l'autenticazione di form sul mio accesso ELMAH mescolato con autenticazione di base sul mio api –

+1

@AntonyScott hai guardato [MADAM ] (Http://www.raboof.com/projects/madam/)? –

8

per ASP.NET Web API utilizzare il pacchetto NuGet Elmah.MVC, i cui dettagli sono riportati di seguito

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

Qual è Elmah ?

ELMAH è un progetto open source il cui scopo è registrare e segnalare eccezioni non gestite nelle applicazioni Web ASP.NET.

Perché utilizzare Elmah?

ELMAH funge da intercettore non invadente di eccezioni ASP.NET non gestite, che di solito si manifestano con ASP.NET yellow screen of death.

Così ora sappiamo cosa e perché utilizzare Elmah, consente di iniziare rapidamente a utilizzare Elmah con il progetto ASP.NET MVC.

Fase 1: Fare clic destro sulla soluzione e selezionare l'opzione "Gestione pacchetti Nuget" enter image description here

Fase 2: Nella ricerca responsabile Nuget Pacchetto per "Elmah" e installare l'estensione NuGet Elmah.MVC. enter image description here Il gestore pacchetti Nuget scaricherà e aggiungerà le dll richieste e modificherà il file web.config <appSetting> per Elmah wo enter image description here rk.

Passaggio 3: Questo è tutto !! La tua Elmah è ora pronta per testare. Ho generato un 404 per verificare se la mia Elmah funziona, ELMAH è accessibile da questo URL: http://yourapp.com/elmah. enter image description here enter image description here

Spero che questo aiuti :)

Letture consigliate:

+4

E stai generando quel 404 da un 'ApiController'? In caso contrario, ed è un controller MVC standard, hai perso completamente il punto della domanda. –

+0

Hanno generato 404 da un normale controller, questo è solo un esempio, lo stesso sarebbe stato se avessi usato il controller webapi e avessi causato un 404. – Yasser

+12

Lo hai provato? Perché sono abbastanza sicuro che non sia così. La gestione delle eccezioni funziona in modo diverso nell'API Web. –

9

Controllare l'URL di sotto di essa descrive in dettaglio come utilizzare ELMAH con API Web:

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

È inoltre possibile utilizzare il pacchetto NuGet di seguito:

Install-Package Elmah.Contrib.WebApi 

Usage:

Basta registrarlo durante l'avvio dell'applicazione o su una base controller-by-controller.

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

    ... 
} 

(da the Elmah.Contrib.WebApi GitHub repo)

18

ci sono due opzioni utilizzando ELMAH per catturare le eccezioni in WEB API.

Se si desidera acquisire gli errori che si verificano in Azioni e controllori, vale a dire nella logica aziendale è possibile creare un ActionFilterAttribute e registrare tali eccezioni in ELMAH.

esempio:

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

Poi wireup aggiungendo tale filtro.

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

Con l'approccio di cui sopra dopo gli errori non saranno trattati:

  • eccezioni generate da costruttori di controller.
  • Eccezioni generate dai gestori di messaggi.
  • Eccezioni generate durante il routing.
  • eccezioni generate durante il contenuto della risposta serializzazione

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

Affinché ELMAH effettuare il login errori WEB API a livello globale in modo tale che tutti i 500 errori del server vengono catturati poi fare questo :

Installare NuGet: https://www.nuget.org/packages/Elmah.Contrib.WebApi/

Aggiungere il seguente per WebApiConfig

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

E se si desidera visualizzare i messaggi di errore personalizzato per gli errori 500 del server è possibile implementare la nuova ExceptionHandler in Api Web (Si noti che ExceptionLogger e ExceptionHandler sono diverse.)

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

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

+0

grazie amico, questo è stato utile. Mi stavo ancora grattando la testa per un po 'fino a quando ho capito come farlo funzionare nella mia situazione (dove il WebApi è anche in esecuzione nel contesto di un sito MVC); la risposta era semplicemente installare anche il pacchetto Elmah.MVC. Espandilo leggermente sul mio post di blog qui: http://dbarrowstechblog.blogspot.co.uk/2015/03/elmah-aspnet-webapi-tip.html –

+0

La prima (semplice) soluzione che chiama direttamente 'Elmah.ErrorLog .GetDefault (HttpContext.Current) .Log' funziona bene, ma non invia una e-mail (se è così che ha impostato Elmah) - registra solo. Se vuoi che la tua eccezione venga gestita da Elmah nel modo che hai specificato in web.config, allora suggerirei di sostituire la chiamata .Log con 'Elmah.ErrorSignal.FromCurrentContext(). Raise (context.Exception); innescare la normale gestione di Elmah. – Greg

Problemi correlati