2012-04-08 14 views
12

Utilizzando un controller API in MVC4, quando l'azione del controller genera un'eccezione, ELMAH non registra l'errore.ELMAH e controller API in MVC4 non errori di registrazione

Penso che il problema è che MVC4 imposta il codice di stato HTTP su 500 e restituisce i dettagli delle eccezioni in un oggetto JSON, ma non genera un'eccezione non gestita in modo che ELMAH non lo veda mai.

Come posso ottenere ELMAH per acquisire tutte le risposte in cui il codice di stato non è 200?

+3

E 'probabilmente la pena notare che i controllori sono API in API Web, non MVC. I percorsi di esecuzione separati per ciascuno sono spesso la causa dell'incompatibilità di una libreria con targeting MVC con Web API. Ogni richiesta passa a MVC o diventa API Web. I due sono side-by-side e non interagiscono (l'API Web non è una funzione all'interno dell'esecuzione MVC). Hanno contesti diversi, tabelle di rotte diverse, diverse configurazioni, tutte diverse, tutte separate. – StarTrekRedneck

risposta

22

L'anwser descritto in precedenza non funziona. Ho provato il mio server di test e ho ricevuto un errore ("L'istanza del filtro data deve implementare una o più delle seguenti interfacce filtro: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.")

Poi ho capito cosa è successo .. .. si sta tentando di aggiungere il filtro personalizzato al Global filtro MVC (filters.Add (nuova ElmahHandledErrorLoggerFilter());)

per rimediare, ho diviso la registrazione filtro GlobalFilter e HTTPFilter

FilterConfig.cs

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

    public static void RegisterHttpFilters(HttpFilterCollection filters) 
    { 
     filters.Add(new ElmahHandledErrorLoggerFilter()); 
    } 

Global.asax

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters); 

;-)

+0

Questo ha funzionato, grazie. – jhilden

+2

Con l'attuale impalcatura dell'API Web, il filtro deve essere registrato in App_Start/WebApiConfig.cs. config.Filters.Add (new ElmahExceptionFilter()); –

+0

Ho appena installato via nuget Elmah.MVC. super facile da usare, ma non registrare 500 errori. Capisco la risposta di cui sopra, ma, non si vede l'ElmahHandledErrorLoggerFilter (mostrato nel frammento di codice di cui sopra) nel mio Elmah * o * Elmah.Mvc spazi EDIT:.. Oops, lo vedo ora .. è una classe che si scrive da soli .. ed è mostrato nello snippet di codice dell'OP. Scusate! ;) – bkwdesign

16

AGGIORNAMENTO: questa risposta non funziona nelle ultime versioni. Usa la risposta di julianox.

Risposta trovato da informazioni qui: http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

Dove i log di filtro eccezione a ELMAH:

public class ElmahHandledErrorLoggerFilter : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     base.OnException(actionExecutedContext); 

     ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception); 
    } 
} 

ma si deve anche aggiungere il filtro di errore per i filtri GlobalConfiguration:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter()); 
     filters.Add(new ElmahHandledErrorLoggerFilter()); 
     filters.Add(new HandleErrorAttribute()); 
    } 
+0

Grandi cose. Ho faticato con questo e non avevo aggiunto il filtro Elmah alla GlobalConfiguration. –

+1

Quando ho fatto questo, non ha funzionato affatto a meno che non ho aggiunto il GlobalConfiguration.Configuration.Filters.Add (new ElmahHandledErrorLoggerFilter()); nel metodo RegisterGlobalFilters. Non dovrebbe i filtri.Add (new ElmahHandledErrorLoggerFilter()); linea lo hanno fatto? Qual è il punto di avere entrambi? – JustinP8

+0

@ JustinP8 WebApi ha ricreato quasi completamente alcune delle cose che erano già in MVC. Sebbene ciò sia frustrante, è possibile notare che WebApi e MVC sono caratteri diversi: una interfaccia utente orientata verso l'altro software orientato. Se controlli i tipi restituiti da GlobalConfiguration.Configuration.Filters (HttpFilterCollection) e GlobalFilters.Filters (GlobalFilterCollection) puoi vedere che sono bestie diverse. – WooWaaBob

Problemi correlati