2009-07-04 41 views
14

我正嘗試使用.NET WebRequest/WebResponse類來訪問此處的Twitter流式API "http://stream.twitter.com/spritzer.json"從開放的HTTP流中讀取數據

我需要能夠打開連接並從打開的連接中逐步讀取數據。

當前,當我調用WebRequest.GetResponse方法時,它將阻塞,直到整個響應被下載。我知道有一個BeginGetResponse方法,但是這隻會在後臺線程上做同樣的事情。我需要在下載仍在進行時訪問響應流。這些對我來說似乎是不可能的。

有Twitter的文檔在這個特定的評論:

「請注意,連接已經在服務器關閉後,一些HTTP客戶端庫只返回響應體,這些客戶端將無法訪問工作。 Streaming API,你必須使用一個HTTP客戶端來遞增地返回響應數據,大多數健壯的HTTP客戶端庫將提供這種功能,Apache HttpClient將處理這個用例,例如。

他們指向Appache HttpClient,但這並沒有多大幫助,因爲我需要使用.NET。

任何想法,這是否可能與WebRequest/WebResponse,或我必須去下級網絡類?也許還有其他的庫可以讓我做到這一點?

THX 艾倫

回答

0

你試過WebRequest.BeginGetRequestStream()

或者是這樣的:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create (http://www.twitter.com); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream()); 

string str = reader.ReadLine(); 
while(str != null) 
{ 
    Console.WriteLine(str); 
    str = reader.ReadLine(); 
} 
+0

我不能使用WebRequest.BeginGetRequestStream因爲我我沒有試圖將數據異步寫入服務器。另外,在您的示例中,您可以調用GetResponse。正是在這一點上,WebRequest在下載服務器響應時被阻塞。但連接永遠不會關閉,因爲它是一個有效的無窮數據流。 – user108687 2009-07-04 10:00:56

-2

只需使用WebClient。它適用於這種簡單的情況,您不需要WebRequest的全部功能。

System.Net.WebClient wc = new System.Net.WebClient(); 
Console.WriteLine(wc.DownloadString("http://stream.twitter.com/spritzer.json")); 
+0

Web客戶端如何讓我從開放流式HTTP連接中獲取增量數據?所有的WebClient.Download *方法都嘗試下載整個響應。我需要使用層疊的HTTP數據增量塊。 – user108687 2009-07-04 10:04:35

+0

哦,你需要流數據?我的錯。 – 2009-07-05 03:01:11

+0

負分...您必須在回答之前閱讀該問題:( – 2014-08-14 04:06:24

13

我結束了使用TcpClient,它工作正常。儘管如此,仍然有興趣知道WebRequest/WebResponse是否可行。這裏是我的代碼,如果有人感興趣:

using (TcpClient client = new TcpClient()) 
{ 

string requestString = "GET /spritzer.json HTTP/1.1\r\n"; 
requestString += "Authorization: " + token + "\r\n"; 
requestString += "Host: stream.twitter.com\r\n"; 
requestString += "Connection: keep-alive\r\n"; 
requestString += "\r\n"; 

client.Connect("stream.twitter.com", 80); 

using (NetworkStream stream = client.GetStream()) 
{ 
    // Send the request. 
    StreamWriter writer = new StreamWriter(stream); 
    writer.Write(requestString); 
    writer.Flush(); 

    // Process the response. 
    StreamReader rdr = new StreamReader(stream); 

    while (!rdr.EndOfStream) 
    { 
     Console.WriteLine(rdr.ReadLine()); 
    } 
} 
} 
5

BeginGetResponse是您需要的方法。它可以讓你不斷的讀取響應流:

class Program 
{ 
    static void Main(string[] args) 
    { 
     WebRequest request = WebRequest.Create("http://stream.twitter.com/spritzer.json"); 
     request.Credentials = new NetworkCredential("username", "password"); 
     request.BeginGetResponse(ar => 
     { 
      var req = (WebRequest)ar.AsyncState; 
      // TODO: Add exception handling: EndGetResponse could throw 
      using (var response = req.EndGetResponse(ar)) 
      using (var reader = new StreamReader(response.GetResponseStream())) 
      { 
       // This loop goes as long as twitter is streaming 
       while (!reader.EndOfStream) 
       { 
        Console.WriteLine(reader.ReadLine()); 
       } 
      } 
     }, request); 

     // Press Enter to stop program 
     Console.ReadLine(); 
    } 
} 

或者,如果你感覺更舒服WebClient(我personnally喜歡過來的WebRequest):

using (var client = new WebClient()) 
{ 
    client.Credentials = new NetworkCredential("username", "password"); 
    client.OpenReadCompleted += (sender, e) => 
    { 
     using (var reader = new StreamReader(e.Result)) 
     { 
      while (!reader.EndOfStream) 
      { 
       Console.WriteLine(reader.ReadLine()); 
      } 
     } 
    }; 
    client.OpenReadAsync(new Uri("http://stream.twitter.com/spritzer.json")); 
} 
Console.ReadLine();