用流+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();
画绿线的部分重复了
是不是每一次 bfs.Read(buffer, 0, buffer.Length) 后都应该 bfs.flush() 一下,请大家帮忙找找其中的原因!
关键在这里
你每次都是将一个完整的 buffer 加到 sb 中,然而并不是每一次
bfs.Read
都会填满整个 buffer,未被填的部分,也就是上次被填的部分也被你加到 sb 中了,造成重复的现象。bfs.Read()
会返回一个整数,是你这次读到的数据量,根据这个量来往 sb 中加东西吧