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();
    }
} 
Другие вопросы по тегам