我正在尝试将以下读取 HttpContent 的完整字符串响应的代码转换为字符串,以仅读取特定的最大字符数。现有代码:
private static async Task<string> GetContentStringAsync(HttpContent content)
{
string responseContent = await content.ReadAsStringAsync().ConfigureAwait(false);
return responseContent;
}
我现在拥有的代码:
private static async Task<string> GetContentStringAsync(HttpContent content, int ResponseContentMaxLength)
{
string responseContent;
Stream responseStream = await content.ReadAsStreamAsync().ConfigureAwait(false);
using (StreamReader streamReader = new StreamReader(responseStream))
{
// responseContent = Data from streamReader until ResponseContentMaxLength
}
return responseContent;
}
我是 StreamReader 和 HttpContent 操作的新手。有没有办法做到这一点?
有多种方法可以做到这一点。然而,恕我直言,最简单的方法之一是创建一个MemoryStream
您已读取所需的确切字节数,然后获得StreamReader
从该流而不是原始流中读取对象。
例如:
private static async Task<string> GetContentStringAsync(HttpContent content, int ResponseContentMaxLength)
{
string responseContent;
Stream responseStream = await content.ReadAsStreamAsync().ConfigureAwait(false);
int totalBytesRead = 0;
byte[] buffer = new byte[ResponseContentMaxLength];
while (totalBytesRead < buffer.Length)
{
int bytesRead = await responseStream
.ReadAsync(buffer, totalBytesRead, buffer.Length - totalBytesRead);
if (bytesRead == 0)
{
// end-of-stream...can't read any more
break;
}
totalBytesRead += bytesRead;
}
MemoryStream tempStream = new MemoryStream(buffer, 0, totalBytesRead);
using (StreamReader streamReader = new StreamReader(tempStream))
{
// responseContent = Data from streamReader until ResponseContentMaxLength
}
return responseContent;
}
当然,上面的假设是ResponseContentMaxLength
有一个足够小的值,可以合理地分配byte[]
足够大以临时存储那么多字节。由于返回的内容具有可比较的规模,因此这似乎是一个合理的假设。
但是,如果您不想维护额外的缓冲区,另一种方法是编写一个Stream
类从底层流对象中读取您指定的字节数,然后传递该实例的实例(用ResponseContentMaxLength
值)到StreamReader
目的。与上述相比,这是相当多的额外工作。 (不过,我想既然这是一个非常有用的对象,可能已经有一个公开可用的实现了……我知道我自己至少写过几次类似的东西,我只是碰巧手边没有代码此时此刻)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)