2014-11-30 6 views
16

la mia domanda dovrebbe essere abbastanza semplice, ma sfortunatamente non ho avuto fortuna nel risolverlo.Come registrare correttamente ogni eccezione usando OWIN

Fondamentalmente, ho alcuni controller API Web ospitati da OWIN e distribuiti su Azure.

ho davvero bisogno di rintracciare le eccezioni che si verificano in ogni middleware (ad esempio OAuthAuthorizationServerProvider o SignalR connessioni persistenti), ma io sicuramente non hanno un indizio su come raggiungerlo.

  • ho provato Elmah, ma non sembra funzionare correttamente con OWIN a causa della mancanza HttpContext.
  • Ho provato a utilizzare log4net, ma sono in grado di registrare solo eccezioni generate dai controller API Web utilizzando un ExceptionFilterAttribute personalizzato. Altre sono ignorate.
  • Ho provato a definire un LoggerFactory personalizzato e ad assegnarlo in Avvio, utilizzando app.SetLoggerFactory(new MyLoggerFactory()), ma l'eccezione generata da altri middleware non viene registrata.
  • Ho cercato di ottenere almeno un messaggio di errore significativo inviato al client, ma nonostante <customErrors mode="Off"/> e <deployment retail="false"/>, Azure si rifiuta di restituire tutto tranne {"message":"an error has occurred"} .. Ho provato sia i siti Web di Azure che i servizi di Azure Cloud.
  • Ho visto alcune alternative cloud che devono funzionare con OWIN, come Elmah.io o Raygun.io, ma non ho bisogno delle loro funzionalità cloud e non è sicuramente la pena pagare centinaia $ all'anno solo per registrare alcune eccezioni .

quello che dovrebbe essere il modo migliore per registro qualsiasi possibile eccezione lanciata dalla mia domanda?

Grazie per il vostro aiuto

risposta

11

hanno di dare un'occhiata a questo link? http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

Poiché non è possibile catturare tutte le eccezioni che utilizzano un exceptionFilter, si propongono di usare un IExceptionLogger e IExceptionHandler per consentire la gestione degli errori globale nel Api Web 2.

Dopo di che, se non è misura il vostro bisogno, è possibile costruire un OwinMiddleWare che verrà posto in prima posizione (prima della fase di autenticazione), questo middleware potrebbe:

  1. creare un RequestID nell'intestazione della risposta
  2. Analizziamo il codice di risposta, prima di inviare la risposta, e se è no ta IsSuccessStatusCode, si potrebbe registrare il messaggio di eccezione ad un DB e sostituire il contenuto della risposta per inviare un semplice messaggio di errore al client utilizzando l'ID richiesta (per consentire di trovare la relativa eccezione nel vostro db)

spero che questo aiuto

+2

Grazie mille, Jeremie. Questo ha fatto il trucco. In particolare, l'utilizzo di IExceptionHandler non è stato sufficiente per rilevare eccezioni da tutti i middleware, incluso OAuth. Ma la definizione di un nuovo middleware e la gestione delle eccezioni al suo interno hanno risolto entrambi i miei problemi: registrarli e decidere cosa inoltrare al client. Grazie ancora! :) –

+0

@MenionLeah Sono nella stessa ricerca per catturare l'eccezione utilizzando middleware, hai una raccomandazione di uno strumento? Abbiamo usato elmah nella domanda precedente e vogliamo qualcosa di simile, grazie – Juan

+0

Ciao @Juan; scusa, ho finito con l'usare il mio codice per archiviarli nel nostro database e ho fornito una pagina web per accedervi. –