Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中读取重复的流数据源#_C#_Httpwebrequest_Streaming_Get_Webrequest - Fatal编程技术网

C# 在C语言中读取重复的流数据源#

C# 在C语言中读取重复的流数据源#,c#,httpwebrequest,streaming,get,webrequest,C#,Httpwebrequest,Streaming,Get,Webrequest,假设我有一个指向流数据源(例如更新的天气数据流)的url,我知道这个url与GET一起工作(我验证了它确实返回了流数据)。流是用GZIP压缩的,每个“消息”都以一个1字节的id开始,一个包含消息长度的2字节部分,然后是另一个包含一些专有信息的2字节部分。之后是消息本身,然后只要流保持打开状态,这种格式就会重复 每次收到完整的消息时,我都需要执行一段代码,将原始字节解析为.net类型(如果我有一个字节数组可以使用,我可以确定解析部分)。我已经尝试了无数的方法,我在网上找到了类似的情况,但由于某种原

假设我有一个指向流数据源(例如更新的天气数据流)的url,我知道这个url与GET一起工作(我验证了它确实返回了流数据)。流是用GZIP压缩的,每个“消息”都以一个1字节的id开始,一个包含消息长度的2字节部分,然后是另一个包含一些专有信息的2字节部分。之后是消息本身,然后只要流保持打开状态,这种格式就会重复

每次收到完整的消息时,我都需要执行一段代码,将原始字节解析为.net类型(如果我有一个字节数组可以使用,我可以确定解析部分)。我已经尝试了无数的方法,我在网上找到了类似的情况,但由于某种原因,无法让这个工作。如果有人也能解释如何使用POST而不是GET来完成同样的过程,我们也会非常感激。提前谢谢大家

另外,从我自己的尝试来看,似乎只有异步读取才能工作。这就是我在尝试时摔倒的地方


鲍勃

到底是什么不起作用?您是否尝试过使用
GetResponseStream()
获取响应流,对
字节[]
缓冲区执行
stream.Read()
,然后使用
位转换器

类似于:

public IEnumerator<Message> GetEnumerator()
{
    HttpWebRequest req = (HttpWebRequest) WebRequest.Create(uri);
    req.AutomaticDecompression = DecompressionMethods.GZip;
    Stream s = req.GetResponse().GetResponseStream();
    BinaryReader read = new BinaryReader(s);
    while(true)
    {
      byte id = read.ReadByte();
      short len = (short)((read.ReadByte() << 8) | read.ReadByte());
      short proprietary = (short)((read.ReadByte() << 8) | read.ReadByte());
      byte[] msgBytes = read.ReadBytes(len);
      yield return new Message(msgBytes);
    }
}
public IEnumerator GetEnumerator()
{
HttpWebRequest req=(HttpWebRequest)WebRequest.Create(uri);
req.AutomaticDecompression=DecompressionMethods.GZip;
流s=req.GetResponse().GetResponseStream();
BinaryReader read=新的BinaryReader;
while(true)
{
字节id=read.ReadByte();
short len=(short)((read.ReadByte())
我找到了一些更好的搜索词,并在这个问题的答案中找到了我丢失的信息。我使用的是IAsyncResult,请求状态对象不正确


流抛出一个异常,基本上说它必须异步读取。它是一个ConnectStream。实际上这看起来很好,但我认为我没有编写过自己的GetEnumerator方法,所以我不确定如何在我的其他代码中使用它。如果OP说的是真的,这将需要像BeginRead一样的异步I/O。这就是我使用它的方式,请让我知道这是否是错误的。while(this.GetEnumerator(getUrl).MoveNext()){byte[]bytes=this.GetEnumerator(getUrl).Current;}当我以这种方式使用它时,它似乎永远在这一行等待:byte[]msgBytes=read.ReadBytes(len)@biker,想法是这将在一个类中,该类具有
uri
实例字段并实现
IEnumerable
。然后可以使用循环来迭代该类的实例。如果没有意义,可以将其更改为返回
IEnumerable
的常规方法,并迭代返回的值。okay,谢谢你的努力。你的实现帮助我意识到哪里出了问题,然后我找到了正确的解决方案(异步解决方案)。