Я повторно использую регистратор запросов как Owin Middleware, который регистрирует URL-адрес запроса и тело всех входящих запросов. Я могу прочитать тело, но если я делаю параметр body в моем контроллере, то он равен нулю.
Я предполагаю, что это null, потому что позиция потока находится в конце, поэтому нет ничего, что можно было бы прочитать, когда он пытается десериализовать тело. У меня была аналогичная проблема в предыдущей версии 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
}
}