Я перепрограммирую регистратор запросов как промежуточное ПО Owin, которое регистрирует URL-адрес запроса и тело всех входящих запросов. Я могу прочитать тело, но если я делаю параметр body в моем контроллере, то null.Обратный поток тела запроса назад
Я предполагаю, что это нулевое значение, потому что позиция потока находится в конце, поэтому нет ничего, что можно было бы прочитать, когда он попытается десериализовать тело. У меня была аналогичная проблема в предыдущей версии веб-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
}
}
Другая альтернатива: Stream anotherStream = new MemoryStream(); context.Request.Body.CopyToAsync (anotherStream); –
В ядре ASP.NET (где метод invoke имеет следующую подпись: «async Task Invoke (контекст HttpContext)»), вы можете сделать следующее, чтобы получить буферный поток, который позволяет вам искать и читать его несколько раз; 'context.Request.EnableRewind()' (метод расширения HttpRequest, найденный в 'Microsoft.AspNetCore.Http.Internal.BufferingHelper'). – jfiskvik
@jfiskvik Ваш вход был очень полезен для меня. Он помог мне перемотать мой поток после обработки, которая произошла в моем MiddleWare. – ExtremeSwat