2010-05-15 11 views
0

J'ai une application qui crée de nombreuses requêtes Web pour télécharger les pages d'actualités d'un site Web (j'ai testé pour de nombreux sites Web) après un certain temps, je découvre que l'application ralentit En récupérant la source html, j'ai découvert que HttpWebResonse échouait à obtenir la réponse. Je poste seulement la fonction qui fait ce travail.HttpWebResonse se bloque sur plusieurs demandes

public PageFetchResult Fetch() 
    { 
     PageFetchResult fetchResult = new PageFetchResult(); 
     try 
     { 
      HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(URLAddress); 
      HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
      Uri requestedURI = new Uri(URLAddress); 
      Uri responseURI = resp.ResponseUri; 
      if (Uri.Equals(requestedURI, responseURI)) 
      { 
       string resultHTML = ""; 
       byte[] reqHTML = ResponseAsBytes(resp); 
       if (!string.IsNullOrEmpty(FetchingEncoding)) 
        resultHTML = Encoding.GetEncoding(FetchingEncoding).GetString(reqHTML); 
       else if (!string.IsNullOrEmpty(resp.CharacterSet)) 
        resultHTML = Encoding.GetEncoding(resp.CharacterSet).GetString(reqHTML); 

       resp.Close(); 
       fetchResult.IsOK = true; 
       fetchResult.ResultHTML = resultHTML; 
      } 
      else 
      { 
       URLAddress = responseURI.AbsoluteUri; 
       relayPageCount++; 
       if (relayPageCount > 5) 
       { 
        fetchResult.IsOK = false; 
        fetchResult.ErrorMessage = "Maximum page redirection occured."; 
        return fetchResult; 
       } 
       return Fetch(); 
      } 
     } 
     catch (Exception ex) 
     { 
      fetchResult.IsOK = false; 
      fetchResult.ErrorMessage = ex.Message; 
     } 
     return fetchResult; 
    } 

toute solution apprécierait

Répondre

0

Fetch fonction est appelée récursive et crée toujours HttpWebRequest mais libérant seulement quand url est adapté. Vous devez fermer la requête et la réponse dans l'instruction else.

0

Je suis d'accord avec @volody, Aussi HttpWebRequest possède déjà la propriété appelée MaximumAutomaticRedirections, qui est définie sur 50, vous pouvez le définir sur 5 pour obtenir automatiquement ce que vous recherchez dans ce code de toute façon, il lèvera exception et cela être géré par votre code.

Il suffit de définir

request.MaximumAutomaticRedirections = 5; 
+0

Merci pour vos commentaires (volody, kava Akash), je l'ai fixé mon code, mais ce n'est pas mon problème (la redirection n'est pas mon point parce que c'est ne se produit jamais son juste une prévention code) cette application aller chercher environ 500 pages Web, puis il se bloque soudain je ne sais pas exactement ce qui vient. une autre solution? – Ehsan

+0

Cela peut poser problème avec le threading, et comment gérez-vous le threading. Vous devriez essayer les extensions parallèles de .net 4.0, ce qui pourrait aider car votre code peut avoir une impasse dont l'extension parallèle peut fournir la même logique avec un thread amélioré. De plus, il se peut que votre pare-feu le bloque en pensant qu'il s'agit d'une attaque, et chaque domaine n'autorise que 2 connexions http simultanées, donc je pense que vous devriez regrouper vos requêtes par domaines et les mettre en file d'attente pour un domaine. . –