使用 StreamReader 读取 HttpContent 流直到字符限制
Posted
技术标签:
【中文标题】使用 StreamReader 读取 HttpContent 流直到字符限制【英文标题】:Read HttpContent stream until a character limit using StreamReader 【发布时间】:2015-09-10 00:02:31 【问题描述】:我正在尝试将以下读取 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 操作的新手。有没有办法做到这一点?
【问题讨论】:
【参考方案1】:有多种方法可以做到这一点。但是,恕我直言,最简单的方法之一是创建一个 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
对象。与上述相比,这是相当多的额外工作。 (不过,我想既然这是一个非常有用的对象,可能已经有一个公开可用的实现......我知道我自己至少已经写过几次类似的东西,我只是碰巧没有方便的代码瞬间)。
【讨论】:
【参考方案2】:@Peter Duniho:感谢您的回复。我最终使用了稍微简单的代码:
using(StreamReader streamReader = new StreamReader(responseStream))
char[] responseContentChars = new char[ResponseContentMaxLength];
streamReader.Read(responseContentChars, 0, ResponseContentMaxLength);
string responseContentString = new string(responseContentChars);
responseContent = responseContentString.Replace("\0", string.Empty);
但如果流在此处被读取后被其他人使用,则上面的代码可能会导致错误。选择的答案将照顾其他阅读原始流的人,因为正在从具有长度 ResponseContentMaxLength 的内容的旧流构造新流。
【讨论】:
以上是关于使用 StreamReader 读取 HttpContent 流直到字符限制的主要内容,如果未能解决你的问题,请参考以下文章
C# 文件流 streamreader如何读取文本指定行的数据?