Вот небольшое усовершенствование первого ответа от Despertar, которое мне очень помогло, но я столкнулся с проблемой при работе с двоичными данными. Промежуточный шаг извлечения потока в строку, а затем возврат его в массив байтов с использованием Encoding.UTF8.GetBytes(body)
испортил двоичный контент (содержимое изменится, если оно не является кодировкой UTF8). Вот мое исправление, использующее Stream.CopyTo()
:
public override async Task Invoke(IOwinContext context)
{
// read out body (wait for all bytes)
using (var streamCopy = new MemoryStream())
{
context.Request.Body.CopyTo(streamCopy);
streamCopy.Position = 0; // rewind
string body = new StreamReader(streamCopy).ReadToEnd();
// log body
streamCopy.Position = 0; // rewind again
context.Request.Body = streamCopy; // put back in place for downstream handlers
await this.Next.Invoke(context);
}
}
Кроме того, MemoryStream
приятно, потому что вы можете проверить длину потока до регистрации всего тела (чего я не хочу делать в случае кто-то загружает огромный файл).