Я пытаюсь получить тело запроса в контроллере ASP.NET Core в виде массива byte[]
. Вот что я изначально написал:
var declaredLength = (int)request.ContentLength;
byte[] fileBuffer = new byte[declaredLength];
request.Body.Read(fileBuffer, 0, declaredLength);
Этот код работает, но только для небольших запросов (около ~ 20 КБ). Для больших запросов он заполняет первые 20 000 или около того байтов в массиве, затем остальная часть массива пуста.
Я использовал некоторый код в верхнем ответе здесь и смогчтобы успешно прочитать все тело запроса после переписывания моего кода:
var declaredLength = (int)request.ContentLength;
byte[] fileBuffer = new byte[declaredLength];
// need to enable, otherwise Seek() fails
request.EnableRewind();
// using StreamReader apparently resolves the issue
using (var reader = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true))
{
reader.ReadToEnd();
}
request.Body.Seek(0, SeekOrigin.Begin);
request.Body.Read(fileBuffer, 0, declaredLength);
Почему StreamReader.ReadToEnd()
может успешно прочитать все тело запроса, а Stream.Read()
- нет? Чтение потока запросов дважды выглядит как хак. Есть ли лучший способ сделать это? (Мне нужно только один раз прочитать поток в байтовый массив)