2011-11-12 126 views
4

我正在嘗試使用Twitter流式API,並試圖爲用戶打開一個流,以便在事件發生時使用它們。我使用一組標準的類來進行REST API調用Twitter。當在「GET」調用中使用https://userstream.twitter.com/2/user.json時,響應流永遠不會結束......我打開一個StreamReader並按照我對任何其他REST調用的方式讀取響應。這對其他人來說可能是顯而易見的,但我該如何「消費」這個流......是否有讀取StreamReader的方式,因爲它正在讀取(意思是在關閉之前)?或者也許有一種不同的方法,我可以用戶消耗這個流....再次,我道歉,如果這接縫是一些初級的,但我現在還不知道...在此先感謝您的任何建議或幫助!在流式傳輸時從Web請求中消耗StreamReader流.NET?

這是原始來源我開始對此進行故障排除......這種方法是從我在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 

UPDATE &相關的問題:

所以,我想通了,下面的方法來保持流開,並將其寫入一個文件(這不會是最後的辦法,我米只是測試,顯影這樣做的最好辦法:)

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對象一起增長cts附加到文本中。我使用Do While 0 < 1進行測試,因爲我只是想看看它工作。我在MSDN StreamReader Constructor Description上看到New構造函數應該爲「leaveOpen」接受一個布爾值,但是當我嘗試將此添加到構造函數時,不允許這樣的參數... 有沒有人有一個很好的例子來說明如何做到這一點強制和無限循環或只是比這更好的方法...我想簡單地閱讀每次從Twitter發送的新更新,並相應地解決它們?顯然有一種方法,我只是新的消費流這樣的概念,沒有它關閉..(**順便說一句,感謝博士邪惡的建議,我是在這個方向上領先......這是不正是他建議,但就是導致我在這裏)

+2

請顯示一些來源...你有什麼試過?什麼是目標/什麼是不工作? – Yahia

+0

Yahia,我已經更新了?與我的原始來源和描述的目標......實質上是讀取此流,並基於此流執行其他代碼塊。 – wakurth

+0

請參閱我的答案中的鏈接 - 您將找到有關如何處理Twitter流媒體API的源代碼和解釋... – Yahia

回答

1

一種用途:你所看見的leaveOpen參數僅在.NET 4中存在。5只及以上

至於如何應對Twitter的流API:

上面的鏈接導致你的開源庫和文檔關於如何訪問Twitter API(均爲 str eaming API和REST API)與.NET/C#。

+0

謝謝Yahia!太棒了。好點,關於「LeaveOpen」參數,我正在使用4.0 ...我檢查了VS 2011開發版本,它在那裏。另外,最酷的是我已經創建了我自己的REST TweetDotNet類庫,它可以工作mint ...我只需爲此創建一個特定的流類並繼承核心OAuth方法。向隊列添加消息非常棒,我不知道爲什麼我沒有想到......頂部鏈接專門回答了問題,其他鏈接有助於從頭開始調整解決方案。 – wakurth

2

使用StreamReader的緩衝喂接收的字節(Encoding.UTF8.GetString),然後把它們添加到StringBuilder得到接收的信號流的字符串。

StringBuilder此言前期的ToString

+0

你好Dr. Evil ...我正在測試這個,並會根據你的建議在適當的時候用我的代碼發佈對這個問題的編輯。謝謝你的見解,先生。 – wakurth