await HttpContent.CopyToAsync() 结果为空目标流

await HttpContent.CopyToAsync() results in empty target stream

我正在尝试(但失败了)从 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,但这闻起来……很臭。

我做错了什么?

我遇到了同样的问题,正在尝试采用您的解决方案。但是一些进一步的谷歌搜索让我找到了一个更好的解决方案 here。原始代码写入一个文件,但这个想法仍然适用。

诀窍是避免使用 CopyToAsync,而是直接使用 ReadAsStreamAsync。这是小改动后的样子:

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