【问题标题】:Consume a StreamReader stream .NET from a web request as it streams?在流式传输时从 Web 请求中使用 StreamReader 流 .NET?
【发布时间】:2011-11-12 00:22:38
【问题描述】:

我正在尝试使用 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

这会将打开的推特流写入文件,每次我发推、转推、删除、直接消息...等等...文件都会随着附加到文本的 JSON 对象而增长。我在这里使用 Do While 0 MSDN StreamReader Constructor Description 上看到,New 构造函数应该接受“leaveOpen”的布尔值,但是当我尝试将它添加到构造函数时不允许这样的参数... 有没有人有一个很好的例子说明如何用强制和无限循环来做到这一点,或者只是比这更好的方法......我想简单地阅读每次从 Twitter 发送的新更新,并相应地解决它们?显然有一种方法,我只是对消费这样的流而不关闭它的概念是新的..(**顺便说一句,感谢邪恶博士的建议,我在这个方向上处于领先地位......这不完全是他的建议,而是导致的我在这里)

【问题讨论】:

  • 请显示一些来源...您尝试了什么?什么是目标/什么不起作用?
  • Yahia,我更新了 ?使用我的原始来源并描述了目标...本质上是读取此流,并基于此流执行其他代码块。
  • 请查看我的回答中的链接 - 您将找到有关如何处理 Twitter 流 API 的源代码和解释...
  • 确保在处理流(实际上是任何一次性对象)时始终用 Using 语句包围它们:msdn.microsoft.com/en-us/library/htd05whh(v=vs.100).aspx
  • @Mataniko - 出色的观察力。我同意。

标签: c# .net vb.net twitter streamreader


【解决方案1】:

使用StreamReader 的缓冲区将接收到的字节提供给(Encoding.UTF8.GetString),然后将它们附加到StringBuilder 以将流作为字符串接收。

使用ToString 中的StringBuilder

【讨论】:

  • Hello Dr. Evil ... 我正在对此进行测试,并将根据您的建议及时发布对此问题的编辑。感谢您的洞察力先生。
【解决方案2】:

提前说明:您看到的 leaveOpen 参数仅存在于 .NET 4.5 及更高版本中

关于如何处理 Twitter 流式 API:

以上链接将引导您访问有关如何使用 .NET / C# 访问 Twitter API(流式 API 和 REST API)的开源库和文档。

【讨论】:

  • 谢谢Yahia!太棒了。好点,关于“LeaveOpen”参数,我使用的是 4.0 ......我检查了 VS 2011 开发版本,它就在那里。此外,很酷的事情是我已经创建了自己的 REST TweetDotNet 类库,它可以正常工作...我只需要为此创建一个特定的流类并继承核心 OAuth 方法。将消息添加到队列非常棒,我不知道为什么我没有想到这一点...顶部链接专门回答了这个问题,其他链接有助于从头开始调整解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多