C# 使用HttpWebRequest C读取无限流#

C# 使用HttpWebRequest C读取无限流#,c#,stream,httpwebrequest,C#,Stream,Httpwebrequest,我使用C#从无穷无尽的http流中获取数据。我以前使用过TCP客户端,但现在我想添加状态代码异常,使用HttpWebResponse更容易实现。我得到了响应,但问题是我无法读取来自服务器的块。一切看起来都很好,但我肯定错过了什么。调试显示执行在ReadLine()处受阻。我还可以看到流缓冲区中有一些数据 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://" + url + "/stream/" + from + "?to

我使用C#从无穷无尽的http流中获取数据。我以前使用过TCP客户端,但现在我想添加状态代码异常,使用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);
    }
}
HttpWebRequest req=(HttpWebRequest)WebRequest.Create(“http://“+url+”/stream/“+from+”?token=“+token”);
使用(HttpWebResponse res=(HttpWebResponse)req.GetResponse())
使用(StreamReader StreamReader=newstreamreader(res.GetResponseStream(),Encoding.UTF8)){
//开始解析周期
而(!streadReader.EndOfStream&!worker.CancellationPending){
字符串resultLine=streadReader.ReadLine();
系统.诊断.跟踪.写入线(结果线);
如果(!resultLine.StartsWith(“{”))继续;
newQuote=JsonConvert.DeserializeObject(结果行);
worker.ReportProgress(0,引号);
}
}

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

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

while(!streamReader.EndOfStream&&!worker.CancellationPending){
char[]buffer=新字符[1024];
streamReader.Read(buffer,0,buffer.Length);
字符串resultLine=“”;
for(int i=0;i
那么可能有很长的一行还是根本没有换行?代码看起来很好。这种错误处理确实令人担忧:
如果(!resultLine.StartsWith(“{”))继续;
。删除它。@usr或创建一个更好的魔术来确定块的结尾。是的,它有点像黑客,必须承认。它从TCP客户端离开,不是每个块都是一个对象:)我将删除它,谢谢。@usr,你是对的。我使用了ReadLine,但从未从服务器端发送\r\n。
    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);
}