Fluxo do corpo da solicitação de retrocesso

Estou reimplementando um registrador de solicitações como Owin Middleware, que registra o URL e o corpo de todas as solicitações recebidas.Eu sou capaz de ler o corpo, mas se eu fizer o parâmetro body no meu controlador é nulo.

Eu acho que é nulo porque a posição do fluxo está no final, então não há mais nada para ler quando ele tenta desserializar o corpo. Eu tive um problema semelhante em uma versão anterior da API da Web, mas consegui definir a posição do Stream novamente como 0. Esse stream específico gera umThis stream does not support seek operations exceção.

Na versão mais recente da Web API 2.0, eu poderia chamarRequest.HttpContent.ReadAsStringAsync()dentro do meu registrador de solicitações e o corpo ainda chegaria intacto ao controlador.

Como posso rebobinar o fluxo depois de lê-lo?

ou

Como posso ler o corpo da solicitação sem consumi-lo?

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
    }
}

questionAnswers(3)

yourAnswerToTheQuestion