2009-07-04 11 views
14

से डेटा पढ़ना मैं ट्विटर स्ट्रीमिंग एपीआई को "http://stream.twitter.com/spritzer.json" पर पहुंचने के लिए .NET WebRequest/WebResponse कक्षाओं का उपयोग करने का प्रयास कर रहा हूं।एक खुली HTTP स्ट्रीम

मुझे कनेक्शन खोलने और खुले कनेक्शन से डेटा को बढ़ाने के लिए सक्षम होने की आवश्यकता है।

वर्तमान में, जब मैं WebRequest.GetResponse विधि को कॉल करता हूं, तब तक यह पूरी प्रतिक्रिया डाउनलोड होने तक अवरुद्ध हो जाता है। मुझे पता है कि BeginGetResponse विधि है, लेकिन यह पृष्ठभूमि पृष्ठभूमि पर वही काम करेगा। डाउनलोड अभी भी हो रहा है, जबकि मुझे प्रतिक्रिया स्ट्रीम तक पहुंच प्राप्त करने की आवश्यकता है। यह सिर्फ इन वर्गों के साथ मेरे लिए संभव नहीं लगता है।

वहाँ ट्विटर दस्तावेज में इस बारे में एक विशिष्ट टिप्पणी है:

"कृपया ध्यान दें कि कुछ HTTP क्लाइंट लाइब्रेरी केवल प्रतिक्रिया शरीर लौटने के बाद कनेक्शन सर्वर द्वारा बंद कर दिया गया इन ग्राहकों तक पहुँचने के लिए काम नहीं करेगा। स्ट्रीमिंग एपीआई। आपको एक HTTP क्लाइंट का उपयोग करना होगा जो प्रतिक्रिया डेटा को क्रमशः वापस कर देगा। अधिकांश मजबूत HTTP क्लाइंट लाइब्रेरी इस कार्यक्षमता को प्रदान करेंगे। उदाहरण के लिए अपाचे एचटीपी क्लाइंट इस उपयोग केस को संभाल लेगा। "

वे 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

-2

बस WebClient का उपयोग करें। यह इस तरह के साधारण मामलों के लिए डिज़ाइन किया गया है जहां आपको WebRequest की पूरी शक्ति की आवश्यकता नहीं है।

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

वेब क्लाइंट मुझे खुले स्ट्रीमिंग HTTP कनेक्शन से वृद्धिशील डेटा लेने की अनुमति देता है? सभी WebClient.Download * विधियां पूरी प्रतिक्रिया डाउनलोड करने का प्रयास करें। मुझे HTTP डेटा की अंतहीन स्ट्रीम के बढ़ते ब्लॉक लेने की आवश्यकता है। – user108687

+0

ओह, आपको डेटा स्ट्रीम करने की आवश्यकता है? मेरी गलती। –

+0

नकारात्मक स्कोर ...जवाब देने से पहले आपको प्रश्न पढ़ना होगा :( –

13

मैं एक टीसीपी क्लाइंट का उपयोग कर समाप्त हुआ, जो ठीक काम करता है। अभी भी यह जानने में दिलचस्पी होगी कि यह 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()); 
    } 
} 
} 
+0

क्या '\ r \ n' आवश्यक है? –

+4

हां, HTTP लाइन-उन्मुख प्रोटोकॉल है। आपको \ r \ n। – Viet

+0

द्वारा आदेशों को अलग करने की आवश्यकता है क्लाइंट द्वारा स्ट्रीम की गई स्ट्रीम है। गेटस्ट्रीम() वास्तव में नेटवर्क स्टैक से स्ट्रीम किया गया है या क्या यह सिर्फ एक कैश मेमोरी स्ट्रीम है? –

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(); 
+0

मैंने यह कोशिश नहीं की क्योंकि मुझे लगता है कि req.EndGetResponse ठीक उसी तरह से ब्लॉक होगा rek.GetResponse करता है, मुझे एक ही समस्या के साथ छोड़ देता है मैं इसे एक शॉट दूंगा। – user108687

+0

मैंने बिना किसी किस्मत के यह कोशिश की। .GetResponseStream() द्वारा लौटाई गई स्ट्रीम एक मेमोरीस्ट्रीम है जिसमें प्रतिक्रिया की पूरी सामग्री शामिल है। – Jeb

+0

@ डारिन डिमिट्रोव, यदि आप लंबे समय तक टाइमआउट के साथ कैसे निपटते हैं धारा के माध्यम से आने वाले डेटा के बीच की अवधि? –