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