La fonction suivante abattrai premiers messages X de Twitter firehose, mais ressemble à des blocs de WebResponse et ne jamais quitter la fonction:Pourquoi WebResponse ne se termine-t-il jamais lors de la lecture de twitter firehose stream?
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();
}
Mais les travaux suivants bien:
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();
}
Qu'est-ce que je fais faux?
Savez-vous où il est suspendu? Pouvez-vous attacher un débogueur et obtenir une trace de pile? Désolé, il n'y a rien de mal avec votre code. Il se peut que le serveur se comporte mal, ou un bogue dans StreamReader. Vous pouvez utiliser des techniques dans http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html pour comprendre ce qui se passe sous les couvertures. Ce serait un bon point de départ. – feroze
Si je supprime les instructions using et les remplace par reader.close() je vois le même problème, et le moniteur de réseau montre que l'application reçoit toujours des données mais ne renvoie pas de reader.close(). PS - comportement testé uniquement sur Vista. – martimedia
Je ne peux pas le reproduire (VS 2008 sur Windows 7 64bit). Cela fonctionne totalement bien ... –