У нас есть открытый вызов 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
уже был вызван.