Ho un servizio WCF ospitato in IIS/ASP.NET che accetta post HTTP (non modulo post) di oggetti serializzati.Acquisizione di dati POST HTTP non elaborati durante l'eccezione
Se il client invia richieste malformate (ad esempio non serializzano correttamente l'oggetto), desidero registrare il messaggio inviato.
Stiamo già utilizzando ELMAH per catturare le eccezioni non gestite, quindi semplicemente allegare i dati del post sarebbe l'opzione più semplice.
È possibile ottenere HttpContext corrente durante un'eccezione, tuttavia questo contiene solo le informazioni dell'intestazione HTTP.
La mia domanda è questa: esiste un modo per acquisire il corpo della richiesta HTTP POST originale? Oppure, in caso contrario - un modo migliore (senza un proxy inverso) di catturare l'input che ha causato l'errore?
Modifica: Giusto per chiarire, eseguire l'acquisizione a livello di pacchetto in ogni momento non è proprio adatto. Sto cercando una soluzione che posso distribuire sui server di produzione e che avrà clienti fuori dal nostro controllo o capacità di monitoraggio.
Modifica # 2: È stato suggerito di accedere a Request.InputStream. Questo non funziona se si sta tentando di leggere dopo che WCF ha letto la richiesta dallo stream.
Un esempio di codice per vedere come ho provato a utilizzare questo è qui.
StringBuilder log = new StringBuilder();
var request = HttpContext.Current.Request;
if (request.InputStream != null)
{
log.AppendLine(string.Format("request.InputStream.Position = \"{0}\"", request.InputStream.Position));
if (request.InputStream.Position != 0)
{
request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}
using (StreamReader sr = new StreamReader(request.InputStream))
{
log.AppendLine(string.Format("Original Input: \"{0}\"", sr.ReadToEnd()));
}
}
else
{
log.AppendLine("request.Inputstream = null");
}
log.ToString();
L'ouput di log.ToString() è:
request.InputStream.Position = "0" Original Input: ""
Il "usando" con StreamReader risulterà nel System.Web.Request.InputStream in fase di eliminazione (il che significa che i dati vengono persi). – Jeff
I dati sono già persi. –