Задать вопрос
AlexXYZ
@AlexXYZ
O Keep Clear O

C# Request.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult() можно ли вызвать два раза подряд на одном Request?

Всем привет.

Обрабатываю тело POST запроса на сервере и получаю содержимое методом:
byte[] arr_body = Request.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult();

5bb2323fa37f4063368025.png
Не является ли ошибкой после применения такого метода повторно вызывать методы чтения входного потока ещё раз, например:

NameValueCollection nvc = Request.Content.ReadAsFormDataAsync().GetAwaiter().GetResult();
или
MultipartMemoryStreamProvider multipart_request = Request.Content.ReadAsMultipartAsync().GetAwaiter().GetResult();

В принципе схема работает и всё читается по второму разу, но действительно ли это допустимо?

P.S.
На Java такой номер не проходил и если я читал один раз данные из Request, то второй раз уже выдавалось исключение.
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • OTUS
    C# Developer. Professional
    6 месяцев
    Далее
  • Ulearn.me
    Основы программирования на примере C#. Часть 1
    1 неделя
    Далее
  • Software-testing.ru
    Программирование на C# для тестировщиков
    10 недель
    Далее
Решения вопроса 1
@basrach
По факту эти методы перечитывают поток. В данном случае "поток" чисто абстракция, а данные на самом деле лежат в памяти. В принципе, если вызвать ReadAsStreamAsync на Response.Content, прочитать этот поток и закрыть его, а затем еще раз попытаться прочитать, то тоже будет исключение. В дот.нет конкретно эти два метода реализованы так, что они не закрывают поток после использования, а читают каждый раз его сначала.
Допустимо ли это? С чисто технической стороны, если это работает, то почему бы и нет. А не с технической нужно руководствоваться принципом наименьшего удивления.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@sunblossom
Вы платите временем процессора, экономя оперативку. Только и всего. Тут уже зависит от того, чего у вас больше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы