从Web请求中以流的方式消耗.NET中的StreamReader流?

4
我正在尝试使用 Twitter 流 API,试图打开一个流以便用户可以随时消费事件。我正在使用一组标准的类来进行对 Twitter 的 REST API 调用。当在 "GET" 调用中使用 https://userstream.twitter.com/2/user.json 时,响应流永远不会结束...... 我正在打开一个 StreamReader 并像处理其他 Twitter REST 调用一样读取响应。这对其他人可能很明显,但是我该如何“消耗”这个流呢?有没有一种方法可以在 StreamReader 关闭之前读取它(也就是在其读取过程中)?或者也许有一种不同的方法可以使用来消耗这个流... 再次感谢任何建议或帮助!!!
下面是我开始研究此问题时使用的原始源代码... 这个方法是从 LinkedIn 论坛上找到的一组 C# 类中编写的。在读取 "responseData = responseReader.ReadToEnd()" 这行代码时,该方法开始 "喝掉" 流... 但是像喝无底杯一样不断地读取这个数据流,直到我停止调试或终止进程为止,这就是我要解决的问题。
Private Function WebResponseGet(ByVal webRequest As HttpWebRequest) As String
    Dim responseReader As StreamReader = Nothing
    Dim responseData As String = ""

    Try
        responseReader = New StreamReader(webRequest.GetResponse().GetResponseStream())
        responseData = responseReader.ReadToEnd()
    Catch
        Throw
    Finally
        webRequest.GetResponse().GetResponseStream().Close()
        responseReader.Close()
        responseReader = Nothing
    End Try

    Return responseData
End Function

更新及相关问题:

所以,我找到了以下方法来保持流的开放,并将其写入文件(这不会是最终方法,我只是在测试和开发最佳方法:)

Private Sub DrinkIt(ByVal webRequest As HttpWebRequest)

    Dim coder As Encoding = Encoding.UTF8

    Dim stream_reader As New StreamReader(webRequest.GetResponse().GetResponseStream(), coder, True, 1024)

    Do While 0 < 1

        Dim w As IO.StreamWriter

        w = File.AppendText(targetFile)

        Dim c(5) As Char

        stream_reader.Read(c, 0, c.Length)

        w.Write(c)

        w.Close()

        w.Dispose()

    Loop

    stream_reader.Close()

    stream_reader.DiscardBufferedData()

    stream_reader.Dispose()

End Sub

这段代码将打开的Twitter流写入文件,每次发推文、转推、删除、发送私信等操作时,JSON对象都会追加到文本中。我在这里使用了Do While 0 < 1进行测试,因为我只想看到它能否正常工作。在MSDN StreamReader Constructor Description上看到,新构造函数应该接受一个布尔值"leaveOpen",但是当我尝试将其添加到构造函数时,却没有允许这样的参数... 是否有人有一个很好的例子来实现此功能,强制执行无限循环或者有更好的方法呢?我希望能够简单地读取从Twitter发送的新更新,并相应地处理它们?显然有一种方法,我只是对像这样消耗流的概念还不熟悉...(**顺便说一句,感谢Dr. Evil的建议,引导我走向这个方向...虽然不完全是他建议的,但是是他让我走到这里)

2
请展示一些源代码……你尝试过什么?目标是什么/有什么问题没有解决? - Yahia
Yahia,我已经使用我的原始代码更新了 ?并描述了目标...基本上是读取此流,并根据该流执行其他代码块。 - wakurth
请查看我回答中的链接 - 您将找到有关如何处理Twitter流API的源代码和解释。 - Yahia
在处理流(或任何可释放对象)时,请务必始终使用Using语句将其包围起来:http://msdn.microsoft.com/zh-cn/library/htd05whh(v=vs.100).aspx - Mataniko
@Mataniko - 很好的观察。我同意。 - wakurth
2个回答

2
使用StreamReader的缓冲区将接收到的字节传递给 (Encoding.UTF8.GetString),然后将它们附加到StringBuilder中以获取接收到的流作为字符串。
使用StringBuilderToString

您好,邪恶博士...我正在测试这个,并将根据您的建议及时发布我的代码编辑到这个问题中。感谢您的洞察力,先生。 - wakurth

1

谢谢Yahia!这太完美了。关于“LeaveOpen”参数,你提到的很好,我一直在使用4.0…我在VS 2011开发版中进行了检查,并且已经加入了该参数。另外,很酷的是,我已经创建了自己的REST TweetDotNet类库,它的效果非常好...我只需要为此创建一个特定的流类并继承核心OAuth方法即可。添加消息到队列中真是太棒了,我不知道为什么我没有想到过...顶部链接明确回答了问题,其他链接则有助于从头开始调整解决方案。 - wakurth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接