Тело запроса API от StreamReader обрезается на 1024 символа - PullRequest
0 голосов
/ 06 июня 2019

У нас есть открытый вызов API, в котором мы хотели бы получить необработанное содержимое тела запроса и сохранить его в записи журнала в нашей базе данных.Основное использование нашего кода следующее:

public HttpResponseMessage PutObjects([FromBody] List<ObjectDTO> objectsDto)
{
    string bodyText = "";
    //HttpContext.Current.Request.GetBufferedInputStream().Close();
    using (var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream))
    {
        bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
        bodyText = bodyStream.ReadToEnd();
    }
    // ... Rest of logic proceeds

Использование этого решения работает, когда передаваемое тело имеет допустимый JSON для десериализации в objectsDto.Однако, когда JSON искажен и не может быть загружен в параметр objectsDto, выдается следующая ошибка:

System.InvalidOperationException: 'Either BinaryRead, Form, Files, or InputStream was accessed before the internal storage was filled by the caller of HttpRequest.GetBufferedInputStream.'

У меня возникла мысль, что если это так, потому что параметр не был заполнениз-за (я предполагаю) автоматического вызова GetBufferedInputStream, что, если я выполню Close() для этого, он сбросит поток и я смогу продолжить.Строка кода, которую я использовал для этого, - это строка с комментариями, которую можно увидеть в примере кода.

Похоже, это работало до более тщательного изучения.Результат ReadToEnd(), вставленный в bodyText, кажется, обрезан в середине, а не читается до конца.Одна интересная деталь, которую я заметил, заключается в том, что она останавливается на длине 1024. Другими словами, только первые 1024 символа возвращаются из ReadToEnd().Конечно, 1024 - это очень подозрительное число для меня, но мое отсутствие знаний о StreamReaders поставило меня в тупик.

Основной вопрос теперь таков: почему StreamReader в этом случае возвращает только первые 1024 символа при вызове ReadToEnd()?Опять же, это происходит только в том случае, если переданный JSON не отформатирован правильно.

Кроме того, если кто-нибудь подумает о более простом способе получить необработанное Тело Просьбы, я тоже готов попробовать это.Заранее спасибо.

РЕДАКТИРОВАТЬ: Я попытался использовать HttpContext.Current.Request.GetBufferlessInputStream(disableMaxRequestLength:true), чтобы увидеть, каков будет результат.Полученная ошибка не позволяет использовать GetBufferlessInputStream после того, как GetBufferedInputStream уже был вызван.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...