M.Kamran Asim Ответов: 1

.объем ядра 3.0 промежуточного входа по pipereader


Я перенес свой исходный код на .net core 3.0. у меня было промежуточное программное обеспечение для регистрации запроса и ответа на запрос api.
Это промежуточное программное обеспечение использовало stream (HttpContext.Request.Тело и HttpContext.Response.Body) для получения данных запроса и ответа json.

Теперь я хочу заменить поток на PipeReader (HttpContext.Request.BodyReader). Я могу получить данные запроса, но мое тело запроса не проверено. Я получаю следующую ошибку.

"errors": {
"$": [
  "The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. Path: $ | LineNumber: 0 | BytePositionInLine: 0."
],


Наверное, в какой-то момент мне придется сбросить положение тела запроса. (Я не уверен).

Для справки я загружаю образец проекта на один диск пример проекта.
Пожалуйста, мне нужно исправить проблему, обсужденную выше.
Также, пожалуйста, научите меня, как регистрировать данные ответа. Должен ли я использовать поток, как это было в .net core 2.2?

Что я уже пробовал:

Я попытался сбросить HttpRequest.Поток тела в исходное положение. Но получите ошибку, так как это уже готовый поток.

Я попытался использовать HttpRequest.EnableBuffering(), но я получил исключение из утилизируемого объекта. (HttpRequest.EnbleBuffering() можно использовать с потоком. Поэтому это не допустимый вариант).

Если я отключу метод to LogRequest (), то промежуточное программное обеспечение будет работать нормально.

1 Ответов

Рейтинг:
8

wkchee

По умолчанию поток будет закрыт после чтения, следовательно, возникнет исключение из удаляемого объекта. Следовательно, нужно получить BodyReader с флагом leaveOpen, установленным в true.

var body = запрос.BodyReader.AsStream(true);
используя Варе, что streamreader = новый поток streamreader(тело);