【问题标题】:Read endless stream with HttpWebRequest C#使用 HttpWebRequest C# 读取无穷无尽的流
【发布时间】:2015-09-10 14:57:51
【问题描述】:

我正在使用 C# 从无尽的 http-stream 中获取数据。之前用过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);
    }
}

【问题讨论】:

  • 那么可能有很长的行或根本没有换行符?代码看起来不错。
  • 这种错误处理真的很让人担心:if(!resultLine.StartsWith("{")) continue;。删除那个。
  • @usr 或者创建一个更好的魔法来确定块的结束。
  • 是的,这有点老套,必须承认这一点。它是从 TCP 客户端离开的,并不是每个块都是那里的对象 :) 我会删除它,谢谢。 @usr,你是对的。我正在使用 ReadLine 但从未从服务器端发送 \r\n。

标签: c# stream httpwebrequest


【解决方案1】:

我发现了错误。我使用的是 ReadLine(),但从未从服务器端发送“\r\n”。我修补了我的服务器以在 JSON 对象 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多