2009-12-10 19 views
6

निम्नलिखित समारोह ट्विटर firehose से पहले एक्स संदेशों नीचे खींच जाएगा, लेकिन WebResponse ब्लॉक की तरह दिखता है और समारोह बाहर निकल जाता है कभी नहीं:ट्विटर फ़ायरहोज स्ट्रीम पढ़ने पर WebResponse कभी खत्म क्यों नहीं होता है?

public void GetStatusesFromStream(string username, string password, int nMessageCount) 
{ 
    WebRequest request = WebRequest.Create("http://stream.twitter.com/1/statuses/sample.json"); 
    request.Credentials = new NetworkCredential(username, password); 

    using (WebResponse response = request.GetResponse()) 
    { 
     using (var stream = response.GetResponseStream()) 
     { 
      using (var reader = new StreamReader(stream)) 
      { 
       while (!reader.EndOfStream) 
       { 
        Console.WriteLine(reader.ReadLine()); 

        if (nMessageCount-- < 0) 
         break; 
       } 
       Console.WriteLine("Start iDispose"); 
      } 
      Console.WriteLine("Never gets here!!!"); 
     } 
    } 

    Console.WriteLine("Done - press a key to exit"); 
    Console.ReadLine(); 
} 

लेकिन निम्नलिखित ठीक काम करता है:

public void GetStatusesFromStreamOK(string username, string password, int nMessageCount) 
    { 
    byte[] encbuff = System.Text.Encoding.UTF8.GetBytes(username + ":" + password); 
    //request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encbuff)); 

    string requestString = "GET /1/statuses/sample.json HTTP/1.1\r\n"; 
    requestString += "Authorization: " + "Basic " + Convert.ToBase64String(encbuff) + "\r\n"; 
    requestString += "Host: stream.twitter.com\r\n"; 
    requestString += "Connection: keep-alive\r\n"; 
    requestString += "\r\n"; 

    using (TcpClient client = new TcpClient()) 
    { 
     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()); 
       if (nMessageCount-- < 0) 
        break; 
      } 

     } 
    } 

    Console.WriteLine("Done - press a key to exit"); 
    Console.ReadLine(); 

} 

मैं क्या कर रहा हूँ गलत?

+0

क्या आपको पता है कि यह कहां लटका हुआ है? क्या आप एक डीबगर संलग्न कर सकते हैं और एक स्टैक ट्रेस प्राप्त कर सकते हैं? ऑफहैंड, आपके कोड में कुछ भी गलत नहीं है। हो सकता है कि सर्वर गलत व्यवहार कर रहा है, या StreamReader में एक बग है। कवर के तहत क्या हो रहा है यह जानने के लिए आप http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html में तकनीकों का उपयोग कर सकते हैं। यह एक अच्छा प्रारंभिक बिंदु होगा। – feroze

+0

यदि मैं उपयोग कथन को हटाता हूं और reader.close() के साथ प्रतिस्थापित करता हूं, तो मुझे एक ही समस्या दिखाई देती है, और नेटवर्क मॉनिटर दिखाता है कि ऐप अभी भी डेटा प्राप्त कर रहा है लेकिन reader.close() से वापस नहीं लौटा रहा है। पीएस - विस्टा पर केवल परीक्षण व्यवहार। – martimedia

+0

मैं इसे पुन: पेश नहीं कर सकता (विंडोज 7 64 बिट पर वीएस 2008)। यह पूरी तरह से ठीक काम कर रहा है ... –

उत्तर

3

के रूप में अपने WebRequest कास्ट HttpWebRequest, तो ब्रेक कॉल request.Abort()

+0

धन्यवाद, अनुरोध जोड़ना। एबॉर्ट() ने WebRequest को HttpWebRequest के रूप में डालने के बावजूद चाल की है। यह सुनिश्चित नहीं है कि मूल कोड कुछ के लिए क्यों काम करता है, लेकिन दृढ़ता से लोगों को अनुरोध जोड़ने की सलाह देगा। अगर वे .NET क्लाइंट की विस्तृत श्रृंखला पर चलना चाहते हैं तो उनके कोड पर जाएं। – martimedia

+0

मैंने इस पर अपने बालों को खींचने में 12 घंटे बिताए:^( –

-1

लग रहा है यह निपटान प्रक्रिया या "का उपयोग" के साथ कुछ है की तरह ...

निम्नलिखित कोड (कोई बयान "का उपयोग") ठीक काम करता है:

public static void GetStatusesFromStream(string username, string password, int nMessageCount) 
    { 
     WebRequest request = WebRequest.Create("http://stream.twitter.com/1/statuses/sample.json"); 
     request.Credentials = new NetworkCredential(username, password); 

     WebResponse response = request.GetResponse(); 
     { 
      var stream = response.GetResponseStream(); 
      { 
       var reader = new StreamReader(stream); 
       { 
        while (!reader.EndOfStream) 
        { 
         Console.WriteLine(reader.ReadLine()); 

         if (nMessageCount-- < 0) 
          break; 
        } 
       } 
       Console.WriteLine("Never gets here!!!"); 
      } 
     } 

     Console.WriteLine("Done - press a key to exit"); 
     Console.ReadLine(); 
    } 
+0

सहमत है कि यह आगे हो जाता है, लेकिन केवल इसलिए कि आप .NET कचरा संग्रह में देरी कर रहे हैं। यदि आप समारोह को दो बार कचरा संग्रह में लाएंगे और कार्यक्रम पहले जैसा लटका होगा। – martimedia