Rebobinar la secuencia del cuerpo de la solicitud

Estoy re-implementando un registrador de solicitudes como Owin Middleware que registra la url de solicitud y el cuerpo de todas las solicitudes entrantes.Puedo leer el cuerpo, pero si lo hago, el parámetro del cuerpo en mi controlador es nulo.

Supongo que es nulo porque la posición de transmisión está al final, por lo que no queda nada para leer cuando intenta deserializar el cuerpo. Tuve un problema similar en una versión anterior de la API web pero pude volver a establecer la posición de Stream en 0. Este flujo en particular arroja unThis stream does not support seek operations excepción.

En la versión más reciente de Web API 2.0 podría llamarRequest.HttpContent.ReadAsStringAsync()dentro de mi registrador de solicitudes, y el cuerpo aún llegaría al controlador intacto.

¿Cómo puedo rebobinar la secuencia después de leerla?

o

¿Cómo puedo leer el cuerpo de la solicitud sin consumirlo?

public class RequestLoggerMiddleware : OwinMiddleware
{
    public RequestLoggerMiddleware(OwinMiddleware next)
        : base(next)
    {
    }

    public override Task Invoke(IOwinContext context)
    {
        return Task.Run(() => {
            string body = new StreamReader(context.Request.Body).ReadToEnd();
            // log body

            context.Request.Body.Position = 0; // cannot set stream position back to 0
            Console.WriteLine(context.Request.Body.CanSeek); // prints false
            this.Next.Invoke(context);
        });
    }
}
public class SampleController : ApiController 
{
    public void Post(ModelClass body)
    {
        // body is now null if the middleware reads it
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta