2009-12-10 16 views
6

Aşağıdaki fonksiyonu Heyecan itfaiye hortumu ilk X mesajları aşağı çekin, ancak WebResponse bloklar gibi görünüyor ve işlevini çıkar asla:Twitter Firehose akışını okurken WebResponse neden bitmiyor?

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(); 
} 

Ama şu çalışıyor:

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

} 

yapıyorum ne yanlış?

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

Nerede takıldığını biliyor musunuz? Bir hata ayıklayıcı ekleyebilir ve yığın izini alabilir misiniz? Offhand, kodunuzda yanlış bir şey yok. Sunucunun hatalı davranması veya StreamReader'da bir hata olması olabilir. Kapaklar altında neler olduğunu öğrenmek için http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html adresindeki teknikleri kullanabilirsiniz. Bu iyi bir başlangıç ​​noktası olurdu. – feroze

+0

Kullanım ifadelerini kaldırırsam ve reader.close() ile değiştirirseniz, aynı sorunu görüyorum ve ağ izleyicisi uygulamanın hala veri aldığını ancak reader.close() uygulamasından dönmediğini gösteriyor. PS - Vista'da yalnızca test edilmiş davranış. – martimedia

+0

Yeniden üretemiyorum (Windows 7 64bit'de VS 2008). Tamamen iyi çalışıyor ... –

cevap

3

olarak WebRequest Cast: o bertaraf işleminin ya da "kullanarak" ile ilgili bir şey var gibi

+0

Teşekkürler, WebRequest'i bir HttpWebRequest olarak yayınlamadan bağımsız olarak, request.Abort() yöntemi eklendi. Orijinal kodun neden bazıları için çalıştığından emin olmadığından emin olun, ancak çok sayıda .NET istemcisi üzerinde çalışmak istiyorsa kullanıcılara istek eklemelerini şiddetle tavsiye edin. – martimedia

+0

Saçımı çekerek 12 saatimi harcadım: ^ –

-1

Aşağıdaki kodu (hayır ifadeleri "kullanan") çalışıyor ... Görünüşe bir HttpWebRequest, daha sonra aramayı beklemeden önce request.Abort()

+0

Daha fazla alınıyor, ama sadece .NET çöp toplama işlemini geciktiriyorsunuz. Eğer işlevi birkaç kez çalıştırırsanız, çöp toplama işlemi devreye girecek ve program önceki gibi duracaktır. – martimedia

İlgili konular