等待HttpContent.CopyToAsync()导致空目标流

时间:2019-02-26 10:44:34

标签: c# httpcontent

我正在尝试(但失败)从Request.HttpContent对象获取实际的JSON字符串。

这是我在做什么:

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,但这闻起来...很臭。

我在这里做什么错了?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并试图采用您的解决方案。但是根据here,通过进一步的谷歌搜索,我找到了一个更好的解决方案。原始代码将写入文件,但是这个想法仍然适用。

诀窍是避免使用CopyToAsync,而直接使用ReadAsStreamAsync。经过较小的更改后,结果如下所示:

using (Stream ms = await content.ReadAsStreamAsync())
{
    using (var reader = new StreamReader(ms))
    {
        return reader.ReadToEnd();
    }
}