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();
}
}
我正在尝试(但失败了)从 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();
}
}