Перемотка потока тела запроса

Я повторно внедряю регистратор запросов как 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
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос