Перемотка потока тела запроса
Я повторно внедряю регистратор запросов как Owin Middleware, который регистрирует URL-адрес запроса и тело всех входящих запросов.Я могу прочитать тело, но если я это сделаю, параметр тела в моем контроллере будет нулевым.
Я предполагаю, что он нулевой, потому что позиция потока находится в конце, поэтому нечего читать, когда он пытается десериализовать тело. У меня была похожая проблема в предыдущей версии Web API, но я смог установить позицию Stream обратно в 0. Этот конкретный поток выбрасываетThis stream does not support seek operations
исключение.
В самой последней версии Web API 2.0 я мог позвонитьRequest.HttpContent.ReadAsStringAsync()
внутри моего регистратора запросов, и тело все равно прибудет к контроллеру в такте.
Как я могу перемотать поток после прочтения?
или же
Как я могу прочитать тело запроса, не потребляя его?
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
}
}