Pregunta

Tengo un servicio de WCF alojado en IIS / ASP.NET que acepta HTTP Post ( no forma posterior ) de los objetos serializados.

Si el cliente envía solicitudes con formato incorrecto (por ejemplo, no están serializar el objeto correctamente) Me gustaría registrar el mensaje enviado hacia arriba.

Ya estamos usando ELMAH para capturar las excepciones no controladas, por lo que simplemente adjuntando los datos de envío sería la opción más fácil.

puedo conseguir la corriente HttpContext durante una excepción, sin embargo esto no sólo contiene la información de encabezado HTTP.

Hay alguna manera de capturar la solicitud HTTP POST cuerpo Original:

Mi pregunta es la siguiente? O, en su defecto - una manera mejor (sin un proxy inverso) de la captura de la entrada que provocó el error?

Editar: Solo para aclarar, corriendo captura a nivel de paquetes en todo momento no es realmente adecuado. Estoy después de una solución que pueda implementar en servidores de producción, y que contará con clientes fuera de nuestro control o capacidad de monitorear.

Edición # 2: Se hizo una sugerencia para acceder a la Request.InputStream - esto no funciona si está tratando de leer después de WCF ha leído la solicitud fuera de la corriente.

Una pieza de muestra de código para ver cómo he intentado usar esto está aquí.

        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();

El ouput de log.ToString () es:

    request.InputStream.Position = "0"
    Original Input: ""
¿Fue útil?

Solución

En el momento en que se pone a su servicio se procesa la solicitud y no está disponible para usted.

Sin embargo ... se puede adjuntar un mensaje de inspector de . Los inspectores de mensajes le permiten jugar con el mensaje antes de que llegue a sus implementaciones de operación. Se puede crear una copia del mensaje tamponada, y copiarlo en el OperationContext.Current.

Rutina fea por supuesto, y que significará sobrecarga de la memoria como ahora dos copias del mensaje están flotando sobre para cada solicitud.

Otros consejos

No te ves en la Propiedad System.Web.Request.InputStream? Se debe tener exactamente lo que quiere.

Como "rebobinar" la propiedad InputStream.

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

Otra opción que debe buscar en es capturar esta información con un HTTPModule en el caso BeginRequest. Los datos deben estar allí en caso BeginRequest porque no creo WCF recoge la petición hasta después PostAuthenticateEvent.

de debajo de ASP.NET (servicio web ASP en IIS) el siguiente código ayuda a:

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

WCF puede ser diferente (es decir Dispone InputStream después de leerlo)

Uso violinista. Libre de la EM. Funciona muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top