用流+Buffer的方式从http response中读出的json数据尾部有重复,使json格式校验不通过。

用流+Buffer的方式从http response中读出的json数据尾部有重复,使json格式校验不通过。

   HttpClient hc = new HttpClient();
    hc.Timeout = new TimeSpan(1000000000);
    Console.WriteLine("defalut timeout: " + hc.Timeout);
    
    if (headMap != null && headMap.Count > 0)
    {
        foreach (string name in headMap.Keys)
        {
            hc.DefaultRequestHeaders.TryAddWithoutValidation(name, headMap[name]);
        }
    }
    var task1 = hc.GetAsync(new Uri(url));
    HttpResponseMessage responseM = task1.Result;
    Console.WriteLine(responseM);
    System.IO.Stream instream = responseM.Content.ReadAsStreamAsync().Result;
    BufferedStream bfs = new BufferedStream(instream);
    byte[] buffer = new byte[1024];
    StringBuilder sb = new StringBuilder();
    int i = 0;
    while (bfs.Read(buffer, 0, buffer.Length) > 0)
    {
        Console.WriteLine(i++);
        Console.WriteLine(Encoding.GetEncoding("UTF-8").GetString(buffer));
        sb.Append(Encoding.GetEncoding("UTF-8").GetString(buffer));
    }
    response = sb.ToString();
    
    bfs.Flush();
    bfs.Close();
    instream.Close();

clipboard.png
画绿线的部分重复了

是不是每一次 bfs.Read(buffer, 0, buffer.Length) 后都应该 bfs.flush() 一下,请大家帮忙找找其中的原因!

阅读 5.6k
1 个回答

关键在这里

sb.Append(Encoding.GetEncoding("UTF-8").GetString(buffer));

你每次都是将一个完整的 buffer 加到 sb 中,然而并不是每一次 bfs.Read 都会填满整个 buffer,未被填的部分,也就是上次被填的部分也被你加到 sb 中了,造成重复的现象。

bfs.Read() 会返回一个整数,是你这次读到的数据量,根据这个量来往 sb 中加东西吧

int size = 0;
while ((size = bfs.Read(buffer, 0, buffer.Lenght)) > 0) {
    // ......
    sb.Append(Encoding.UTF8.GetString(buffer, 0, size));
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏