Domanda

Ho un servizio WCF ospitato in IIS / ASP.NET che accetta HTTP Post ( non modulo di inserimento ) di oggetti serializzati.

Se il client invia le richieste malformate (ad esempio, che non stanno serializzare l'oggetto correttamente) Mi piacerebbe registrare il messaggio inviato in su.

Stiamo già utilizzando ELMAH per catturare le eccezioni non gestite, in modo semplicemente collegando i dati post sarebbe l'opzione più semplice.

posso avere la corrente HttpContext durante un'eccezione, tuttavia questo non contiene solo le informazioni di intestazione HTTP.

C'è un modo di catturare il corpo della richiesta HTTP POST originale:

La mia domanda è questa? O, in mancanza di questo - un modo migliore (senza un proxy inverso) di catturare l'input che ha causato l'errore?

Edit: Giusto per chiarire, in esecuzione a livello di cattura dei pacchetti a tutti i tempi non è proprio adatto. Sto cercando una soluzione che posso distribuire ai server di produzione, e che avrà i clienti al di fuori del nostro controllo o la capacità di monitorare.

Modifica # 2: Un suggerimento è stato fatto per accedere al Request.InputStream - questo non funziona se si sta cercando di leggere dopo WCF ha letto la richiesta fuori dal flusso.

Un pezzo campione di codice per vedere come ho provato ad 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'output di log.ToString () è il seguente:

    request.InputStream.Position = "0"
    Original Input: ""
È stato utile?

Soluzione

Con il tempo si arriva al vostro servizio la richiesta viene elaborata e non a disposizione di voi.

Comunque ... si potrebbe allegare una messaggio ispettore . Gli ispettori dei messaggi consentono di giocherellare con il messaggio prima che raggiunga le vostre implementazioni di funzionamento. È possibile creare una copia del messaggio tamponata, e copiarlo nella OperationContext.Current.

mod Ugly naturalmente, e vorrà dire sovraccarico di memoria come ora due copie del messaggio galleggiano circa per ogni richiesta.

Altri suggerimenti

Hai guardato al System.Web.Request.InputStream proprietà? Esso dovrebbe avere esattamente quello che vuoi.

Come "riavvolgere" l'InputStream Proprietà.

    if (Request.InputStream.Position != 0)
    {
        Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
    }

Un'altra opzione che si dovrebbe guardare in è catturare queste informazioni con un HttpModule sull'evento BeginRequest. I dati dovrebbero essere lì a caso BeginRequest perché non credo WCF raccoglie la richiesta fino a dopo PostAuthenticateEvent.

da sotto ASP.NET (servizio Web ASP in IIS) il seguente codice consente:

if (request.InputStream.Position != 0)
{
  request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}

WCF forse differente (cioè Dispone InputStream dopo averlo letto)

Usa violinista. Libero da MS. Funziona alla grande.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top