await HttpContent.CopyToAsync() приводит к пустому целевому потоку
Я пытаюсь (и не удается) получить фактическую строку JSON из объекта Request.HttpContent.
Вот что я делаю:
private async Task<string> GetRequestBodyAsString(HttpContent content)
{
string result;
using (var streamCopy = new MemoryStream())
{
await content.CopyToAsync(streamCopy);
streamCopy.Position = 0;
result = new StreamReader(streamCopy).ReadToEnd();
}
return result;
}
Моя проблема заключается в том, что при выполнении этого кода я всегда получаю пустую строку - если я не использую точку останова на строке, которая устанавливает нулевую позицию streamCopy, что заставляет меня думать, что код продолжает выполняться после запуска метода CopyToAsync.,
Если я изменю это на:
using (var streamCopy = new MemoryStream())
{
do
{
count++;
await content.CopyToAsync(streamCopy);
} while (streamCopy.Length == 0);
streamCopy.Position = 0;
result = new StreamReader(streamCopy).ReadToEnd();
}
это неизменно работает правильно (как, в результате будет содержать JSON, но это пахнет... грязно.
Что я здесь не так делаю?
0 ответов
Я столкнулся с той же проблемой и пытался принять ваше решение. Но некоторые дальнейшие поиски в Google приводят меня к лучшему решению, приведенному здесь. Исходный код записывает в файл, но идея все еще применима.
Уловка заключается в том, чтобы избежать использования CopyToAsync
, но используя ReadAsStreamAsync
прямо. Вот как это выглядит после незначительных изменений:
using (Stream ms = await content.ReadAsStreamAsync())
{
using (var reader = new StreamReader(ms))
{
return reader.ReadToEnd();
}
}