You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# .NET中StreamReader返回缓冲区长度而非实际流数据问题求助

问题原因及修复方案

你遇到的问题核心是错误使用了StreamReader.Read()的返回值:
StreamReader.Read(char[] buffer, int index, int count)方法的返回值是本次读取到的字符数量(整数类型),而不是读取到的实际文本内容。你直接将这个整数拼接到json字符串中,自然会得到一串重复的数字(比如4096)。


修复方案

要正确读取流内容,需要先将字符读取到缓冲区,再把缓冲区里的有效字符(从0到实际读取长度)添加到字符串中。同时建议用StringBuilder代替直接字符串拼接,避免频繁创建字符串带来的性能损耗。

修正后的代码:

StringBuilder jsonBuilder = new StringBuilder();
context.Request.InputStream.Position = 0;

using (StreamReader inputStream = new StreamReader(context.Request.InputStream))
{
    char[] buffer = new char[4096];
    int readCount;
    // 直接通过Read的返回值判断是否还有内容可读
    while ((readCount = inputStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        // 将缓冲区中实际读取到的字符添加到StringBuilder
        jsonBuilder.Append(buffer, 0, readCount);
        System.Console.WriteLine(jsonBuilder.Length);
    }
    string json = jsonBuilder.ToString();
}

补充说明

  • 用StringBuilder处理字符串拼接是.NET中处理大量字符串拼接的标准做法,性能远优于直接+=操作
  • 循环条件改为判断readCount > 0,比Peek()更可靠,因为Peek()在某些流场景下可能无法准确判断是否还有剩余内容
  • 必须使用Append(buffer, 0, readCount)而不是直接Append(buffer),因为最后一次读取可能无法填满整个缓冲区,直接Append会包含缓冲区里的无效字符

内容的提问来源于stack exchange,提问作者KWallace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:46:24