2010-01-07 4 views
3

Je dois tester environ 300 URL pour vérifier si elles mènent à des pages réelles ou redirigent vers une autre page. J'ai écrit une application simple dans .NET 2.0 pour le vérifier, en utilisant HttpWebRequest. Voici l'extrait de code:HttpWebRequest.AllowAutoRedirect = false peut provoquer un dépassement de délai?

System.Net.HttpWebRequest wr = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url); 
System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)wr.GetResponse(); 
code = resp.StatusDescription; 

Le code a couru rapidement et a écrit au dossier que toutes mes URL retournent l'état 200 OK. Puis j'ai réalisé que par défaut GetResponse() suit les redirections. Que je suis bête! J'ai donc ajouté une ligne pour le faire fonctionner correctement:

System.Net.HttpWebRequest wr = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url); 
wr.AllowAutoRedirect = false; 
System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)wr.GetResponse(); 
code = resp.StatusDescription; 

j'ai couru à nouveau le programme et attendu ... attendu ... attendu ... Il est avéré que pour chaque URL que je recevais un System.Net .WebException "L'opération a expiré". Surpris, j'ai vérifié l'URL manuellement - fonctionne bien ... J'ai commenté AllowAutoRedirect = ligne fausse - et cela fonctionne bien encore. Non commenté cette ligne - timeout. Des idées sur ce qui pourrait causer ce problème et comment contourner?

Répondre

8

Souvent, les délais d'attente sont dus au fait que les réponses Web ne sont pas éliminées. Vous devriez avoir une déclaration using pour votre HttpWebResponse:

using (HttpWebResponse resp = (HttpWebResponse)wr.GetResponse()) 
{ 
    code = resp.StatusDescription; 
    // ... 
} 

Nous avions besoin de faire une analyse plus approfondie de prédire si c'est certainement le problème ... ou vous pouvez simplement essayer :)

La raison en est que .NET dispose d'un pool de connexions et si vous ne fermez pas la réponse, la connexion n'est pas renvoyée au pool (au moins jusqu'à ce que le GC finalise la réponse). Cela conduit à un blocage pendant que la demande est en attente d'une connexion.

+0

Aucune idée pourquoi cela a fonctionné sans AllowAutoRedirect = false ou comment a-t-il su à la première demande que je ne vais pas le fermer correctement, mais ça m'a aidé! – user34402

+0

@perpetka: Lors de la redirection, il fermait probablement la connexion d'origine et disposait de suffisamment d'hôtes * différents * pour se rediriger afin d'éviter le problème. –

+0

Cela a du sens. Merci beaucoup pour votre aide! – user34402

Questions connexes