2010-08-20 4 views
2

EDIT: Résolu, le problème était côté serveur. J'utilise C# et .NET2 et je me demande est un bug WebRequest .. Je fais plusieurs bonnes demandes avec cette méthode et tout va bien, mais après cela chaque fois que je reçois "L'opération a expiré." . Je ne comprends vraiment pas pourquoi.WebRequest bug?

public string RequestPage(string url) { 
     HttpWebRequest req = null; 
     string line = ""; 
     string site = ""; 

     try { 
      req = (HttpWebRequest) WebRequest.Create(url.Trim()); 
      req.Timeout = 10000; 

      StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream()); 
      while ((line = reader.ReadLine()) != null) { 
       site += line; 
      } 

      return site; 
     } catch (Exception ex) { 
      MessageBox.Show("ERROR " + ex.Message); 
     } 

     return null; 
    } 
+0

non, ce n'est pas un bug dans 'HttpWebRequest'. Que se passe-t-il si vous essayez de coller l'URL dans votre navigateur? –

+0

C'est une page sur youtube, donc ça marche bien. – blez

+0

Oui, mais vous avez probablement besoin d'envoyer des en-têtes HTTP pour que cela fonctionne comme 'User-Agent' et' Accept'. Avez-vous vérifié l'en-tête HTTP envoyé par votre navigateur? Il y a des sites qui bloquent les robots qui ne s'identifient pas eux-mêmes. –

Répondre

2

Je ne sais pas si cela résout votre problème, mais vous devez toujours disposer d'un HttpWebResponse (et d'autres objets qui mettent en œuvre IDisposable) lorsque vous avez terminé:

public string RequestPage(string url) 
{ 
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
    req.Timeout = 10000; 

    using (WebResponse resp = req.GetResponse()) 
    using (StreamReader reader = new StreamReader(resp.GetResponseStream())) 
    { 
     return reader.ReadToEnd(); 
    } 
} 

Si vous n'êtes pas exigent en fait toutes les fonctionnalités de HttpWebRequest, vous pouvez utiliser à la place WebClient:

public string RequestPage(string url) 
{ 
    using (WebClient client = new WebClient()) 
    { 
     return client.DownloadString(url); 
    } 
} 
+0

En utilisant la seconde méthode, elle reste bloquée. Peut-être que c'est une protection de bot youtube? – blez

+0

+1 pour 'WebClient'. –

2

Vous n'êtes pas disposer de la réponse:

using (WebResponse response = req.GetResponse()) 
using (StreamReader reader = new StreamReader(response.GetResponseStream()) 
{ 
    while ((line = reader.ReadLine()) != null) { 
     site += line; 
    } 
} 

Fondamentalement, il existe des connexions mis en commun par serveur que vous parlez. Vous en manquez parce que vous ne fermez pas la réponse. Ce qui précède devrait le trier.

De plus:

  • C'est un moyen potentiellement très lent de construire une chaîne. Utilisez un StringBuilder pour concaténer le contenu du texte dans une boucle.
  • Voulez-vous vraiment supprimer tous les retours à la ligne? Sinon, utilisez simplement reader.ReadToEnd() à la place.
+0

Je viens d'essayer ça. Même chose. Sur la 4ème demande, il se bloque. – blez

+0

@blez, le code que @Jon a montré est parfaitement bien alors essayez-le avec un autre site. Si cela fonctionne, youtube limite vos demandes. –

+0

@Darin Dimitrov oui, cela fonctionne pour d'autres sites. Donc, ça devrait être YouTube. Que devrais-je faire? Envoyer des en-têtes IE/Firefox ou? – blez