使用 HttpWebRequest C# 读取无限流

Read endless stream with HttpWebRequest C#

我正在使用 C# 从无穷无尽的 http 流中获取数据。之前用的是TCP Client,现在想添加状态码异常,用HttpWebResponse 就简单多了。我得到了回应,但问题是我无法读取来自服务器的块。一切看起来都很好,但我一定错过了什么。调试显示执行停滞在 ReadLine()。我还可以看到流缓冲区中有一些数据。

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://" + url + "/stream/" + from + "?token=" + token);
using(HttpWebResponse res = (HttpWebResponse)req.GetResponse())
using(StreamReader streadReader = new StreamReader(res.GetResponseStream(),Encoding.UTF8)){
    //Start parsing cycle
    while(!streadReader.EndOfStream && !worker.CancellationPending) {
        string resultLine = streadReader.ReadLine();
        System.Diagnostics.Trace.WriteLine(resultLine);
        if(!resultLine.StartsWith("{")) continue;
        newQuote quote = JsonConvert.DeserializeObject<newQuote>(resultLine);
        worker.ReportProgress(0, quote);
    }
}

我发现了错误。我正在使用 ReadLine(),但从未从服务器端发送“\r\n”。我修补了我的服务器以在 JSON object ant 之后发送 \r\n 它现在工作正常。 另一种选择是使用 Read() 方法。它不是在等待行尾,但你必须知道块长度。 感谢您的帮助:)

更新:如何使用 Read() 方法解析字符串:

    while(!streamReader.EndOfStream && !worker.CancellationPending) {
    char[] buffer = new char[1024];
    streamReader.Read(buffer, 0, buffer.Length);
    string resultLine="";
    for(int i = 0; i < buffer.Length; i++) {
        if(buffer[i] != 0) resultLine += buffer[i].ToString();
    }
    newQuote quote = JsonConvert.DeserializeObject<newQuote>(resultLine);
    worker.ReportProgress(0, quote);
}