2011-12-31 7 views
13

Sto utilizzando Elmah per registrare le eccezioni. Elmah è ottimo per la registrazione dei corpi delle richieste se la richiesta è una richiesta basata su form (ad esempio Content-Type: application/x-www-form-urlencoded), ma con richieste basate su JSON in cui il tipo di contenuto è application/json, il corpo della richiesta non si trova da nessuna parte nelle segnalazioni di errore. Qualcuno sa dove posso trovare questo corpo di richiesta in modo che possa diagnosticare correttamente le mie eccezioni?Elmah: Come ottenere il corpo della richiesta HTTP JSON dal rapporto di errore

UPDATE: 2012-01-03

Come un chiarimento su ciò che intendo per le richieste in base JSON, ecco un esempio di richiesta HTTP grezzo con JSON come il corpo della richiesta:

PUT http://mycompany.com/api/v1.0/me HTTP/1.1 
Host: mycompany.com 
Content-Length: 20 
Content-Type: application/json 

{"city":"Vancouver"} 
+0

Cosa fate voi significa con richieste basate su JSON? Stanno ricevendo tramite GET o POST? Se inserisci una pagina dei dettagli e fai clic su "Dati grezzi/di origine in XML", puoi vedere il corpo lì? – alexn

+0

@alexn, le richieste vengono inviate tramite PUT e POST. I dati grezzi/di origine in XML non mostrano il corpo della richiesta per le richieste basate su JSON. Si prega di consultare le mie informazioni aggiornate sopra per un chiarimento su cosa intendo per richieste basate su JSON. –

risposta

17

ELMAH finora registra solo il contesto o le informazioni che sono periferiche alla richiesta e che possono essere catturate in modo conveniente in un modo standard. I moduli sono discutibilmente un trattamento speciale perché ASP.NET svolge già il lavoro di decodifica e memorizzando le entità di richiesta quando il tipo MIME è application/x-www-form-urlencoded. Le richieste JSON d'altra parte sono prolemi perché al momento in cui si verifica un'eccezione, il flusso di input (HttpRequest.InputStream) potrebbe essere stato parzialmente o completamente utilizzato da un decodificatore JSON. ELMAH non sarebbe in grado di ottenere una seconda incrinatura a scopo di registrazione. Dovrai quindi assicurarti di bufferizzare il flusso di input o il testo prima di passarlo attraverso qualsiasi decodificatore JSON e riporlo da qualche parte come HttpContext.Items. È quindi possibile provare a ripristinare i dati memorizzati nel buffer e attach it to an outgoing mail at the time of an error. Al momento ELMAH non supporta l'associazione di dati arbitrari a un errore registrato. Esiste tuttavia lo ErrorLogModule che ha un evento Logged e che fornisce l'ID dell'errore registrato. Questo potrebbe essere usato per memorizzare i dati di input altrove (magari in un'altra tabella se si sta utilizzando un database di back-end per i log degli errori) ma legarlo all'errore registrato mantenendo un'associazione tramite l'Id.

+0

Grazie Atif per la tua risposta dettagliata. Per quanto riguarda l'opzione di posta in uscita (cioè all'interno di ErrorMail_Mailing), non ho accesso a HttpContext, quindi non posso accedere a HttpContext.Items. Se potessi accedere a HttpContext, allora posso provare a recuperare il corpo della richiesta da HttpRequest.InputStream se è ancora disponibile. È possibile accedere a HttpContext da ErrorMail_Mailing? –

+0

Si dovrebbe avere accesso alla proprietà ['Context'] (http://msdn.microsoft.com/en-us/library/system.web.httpapplication.context.aspx) all'interno del gestore eventi. È ereditato da ['HttpApplication'] (http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx) da' Global.asax'. Prova 'this.Context' o digita' this' then period (.) E dovrebbe apparire in IntelliSense nell'IDE. –

+0

this.Context è null e this.Request genera un'eccezione perché non è più disponibile. HttpContext.La corrente è nullo pure. Sembra che ErrorMail_Mailing venga chiamato dopo che la risposta è stata inviata. –

1

Oltre alla risposta di Atif qui, c'è un modo per add additional details to ELMAH log lanciando manualmente una nuova eccezione. Non è particolarmente elegante ma sembra fare il lavoro!

Sarei interessato a sapere eventuali osservazioni da parte dell'uomo stesso ...

+0

Interessante. Grazie. –

4

primo pacchetto di installazione NuGet: Newtonsoft.Json

install-package Newtonsoft.Json 

poi:

public override void OnException(HttpActionExecutedContext filterContext) 
     { 
    var message = new StringBuilder(); 
      foreach (var param in filterContext.ActionContext.ActionArguments) 
      { 
       message.Append(string.Format("{0}:{1}\r\n", param.Key, Newtonsoft.Json.JsonConvert.SerializeObject(param.Value))); 
      } 
      var ex = new Exception(message.ToString(), filterContext.Exception); 
      var context = HttpContext.Current; 
      ErrorLog.GetDefault(context).Log(new Error(ex, context)); 
} 
Problemi correlati