2010-07-29 13 views
1

J'ai un robot qui télécharge les pages et les traite. après 1 heure chaque requête aux sources prend 1 minute ou plus pour terminer mais au début du programme chaque adresse est téléchargée sous 1 seconde, je suspecte que les sites web de destination limitent ma demande ou trafic mais quand je ferme le programme et le lance la performance redevient normale. donc il y a un problème avec mon code Toute aide serait grandement apprécierHttpWebReqest dans la page fetcher slow down

public class PageFetcher 
{ 
    public PageFetcher() { } 
    public PageFetcher(string urlAddress) { URLAddress = urlAddress; } 
    private int relayPageCount = 0; 

    public string URLAddress { get; set; } 
    public string FetchingEncoding { get; set; } 

    public PageFetchResult Fetch() 
    { 
     PageFetchResult fetchResult = new PageFetchResult(); 
     HttpWebRequest req = null; 
     HttpWebResponse resp = null; 
     try 
     { 
      req = (HttpWebRequest)HttpWebRequest.Create(URLAddress); 
      req.UserAgent = "Mozilla/4.0"; 
      req.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); 
      resp = (HttpWebResponse)req.GetResponse(); 

      string resultHTML = ""; 
      byte[] reqHTML = ResponseAsBytes(resp); 
      Stream resultStream = new MemoryStream(reqHTML); 
      resultStream.Position = 0; 

      string contentEncoding = resp.ContentEncoding.ToLower(); 
      if (contentEncoding.Contains("gzip") || contentEncoding.Contains("deflate")) 
      { 
       if (contentEncoding.Contains("gzip")) 
        resultStream = new GZipStream(resultStream, CompressionMode.Decompress); 

       if (contentEncoding.Contains("deflate")) 
        resultStream = new DeflateStream(resultStream, CompressionMode.Decompress); 
      } 

      StreamReader readerStream = null; 

      if (!string.IsNullOrEmpty(FetchingEncoding)) 
       readerStream = new StreamReader(resultStream, Encoding.GetEncoding(FetchingEncoding)); 
      else if (!string.IsNullOrEmpty(resp.CharacterSet)) 
       readerStream = new StreamReader(resultStream, Encoding.GetEncoding(resp.CharacterSet)); 

      resultHTML = readerStream.ReadToEnd(); 
      req.Abort(); 
      resp.Close(); 
      fetchResult.IsOK = true; 
      fetchResult.ResultHTML = resultHTML; 
      URLAddress = resp.ResponseUri.AbsoluteUri; 
     } 
     catch (Exception ex) 
     { 
      if (req != null) 
       req.Abort(); 
      if (resp != null) 
       resp.Close(); 
      fetchResult.IsOK = false; 
      fetchResult.ErrorMessage = ex.Message; 
     } 
     return fetchResult; 
    } 

Répondre

1

Votre code semble bon. Il y a quelques raisons possibles pour lesquelles vous pourriez voir un ralentissement.

Première: mise en cache amont. Par exemple, si vous exécutez un test plusieurs fois sur le même groupe d'URL, une fois que vous cliquez sur une URL, elle est mise en cache dans plusieurs endroits: votre serveur proxy (si vous en avez un), les proxy de votre fournisseur Internet (s'ils les avoir), la mise en cache du site de destination, etc

Donc, pour tout test de vitesse du moteur de balayage, assurez-vous que vous choisissez des URL provenant d'un très grand nombre d'URL (assez grand pour que l'un d'entre eux soit mis en cache à la suite de votre rampement est très petit).

Ensuite, je regarderais le reste de votre application. Êtes-vous sûr que c'est la récupération réelle qui est lente? Ou est une autre partie de votre application (par exemple la partie qui stocke les données récupérées) peut-être provoquer le ralentissement. Comme la plupart des mécanismes de stockage de données (RAM, bases de données, etc.) sont beaucoup plus lents lorsque vous y insérez plus de données, vous devez vous assurer de ne synchroniser que votre accès HTTP et ne pas regarder le débit global du robot, y compris le stockage. .

+0

Oui aller chercher va ralentir et je regarde dans HttpWebResponse.GetResponse() qui est le criminel principal! pensez-vous qu'il est lié au site Web de destination ou l'autre extrémité? – Ehsan