Pourquoi ce code WebRequest est-il lent?
J'ai demandé 100 pages que tous les 404. J'ai écrit
{
var s = DateTime.Now;
for(int i=0; i < 100;i++)
DL.CheckExist("http://google.com/lol" + i.ToString() + ".jpg");
var e = DateTime.Now;
var d = e-s;
d=d;
Console.WriteLine(d);
}
static public bool CheckExist(string url)
{
HttpWebRequest wreq = null;
HttpWebResponse wresp = null;
bool ret = false;
try
{
wreq = (HttpWebRequest)WebRequest.Create(url);
wreq.KeepAlive = true;
wreq.Method = "HEAD";
wresp = (HttpWebResponse)wreq.GetResponse();
ret = true;
}
catch (System.Net.WebException)
{
}
finally
{
if (wresp != null)
wresp.Close();
}
return ret;
}
Deux pistes de montrer qu'il prend 00:00:30.7968750 et 00:00:26.8750000. Ensuite, j'ai essayé firefox et utiliser le code suivant
<html>
<body>
<script type="text/javascript">
for(var i=0; i<100; i++)
document.write("<img src=http://google.com/lol" + i + ".jpg><br>");
</script>
</body>
</html>
À l'aide de mon ordi le temps de comptage et il était à peu près 4 secondes. 4 secondes est de 6,5-7,5 plus rapide que mon application. J'ai l'intention de parcourir des milliers de fichiers afin de prendre 3,75 heures au lieu de 30 minutes serait un gros problème. Comment puis-je rendre ce code plus rapide? Je sais que quelqu'un va dire firefox met en cache les images, mais j'ai envie de dire que 1) il a encore besoin de vérifier les en-têtes du serveur distant pour voir si il a été mis à jour (qui est ce que je veux que mon application pour le faire) 2) je ne suis pas de recevoir le corps, mon code ne devrait être demander l'en-tête. Alors, comment puis-je résoudre ce problème?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Probablement Firefox problèmes de plusieurs demandes à la fois alors que votre code ne un par un. Peut-être l'ajout des threads de la vitesse de votre programme.
J'ai remarqué qu'un
HttpWebRequest
se bloque sur la première demande. J'ai fait quelques recherches et ce qui semble se passer, c'est que la demande est la configuration de la détection automatique des procurations. Si vous définissezsur le web objet de demande, vous pourriez être en mesure d'éviter un retard initial.
Avec proxy auto-detect:
Sans proxy auto-detect:
modifier votre code asynchrone getresponse
Async Obtenir
La réponse est en train de changer HttpWebRequest/HttpWebResponse à WebRequest/WebResponse seulement. Qui a résolu le problème.
Avez-vous essayé d'ouvrir la même URL à-dire sur la machine que votre code est déployé? Si c'est un Windows Server machine puis parfois c'est parce que l'url que vous demandez n'est pas dans IE (HttpWebRequest fonctionne) liste des sites sécurisés. Vous aurez juste besoin de l'ajouter.
Ne vous avez plus d'info, vous pouvez poster? J'ai fait quelque chose de similaire et ont eu des tonnes de problèmes avec HttpWebRequest avant. Tous uniques. Donc, plus d'info devrait vous aider.
BTW, appelant à l'aide des méthodes asynchrones ne sera pas vraiment utile dans ce cas. Il n'est pas de raccourcir le temps de téléchargement. Il n'a tout simplement pas bloquer votre thread appelant.
fermer le flux de réponse lorsque vous avez terminé, si dans votre checkExist(), ajouter wresp.Close() après wresp = (HttpWebResponse)wreq.GetResponse();
OK si vous obtenez le code d'état 404 pour toutes les pages web puis c'est en raison de ne pas spécifier les informations d'identification. Si vous avez besoin d'ajouter
Alors vous pouvez également venir à travers le code de statut= 500 pour cela, vous devez spécifier l'Agent Utilisateur. Qui ressemble à quelque chose comme la ligne ci-dessous
Pour améliorer les Performances de la HttpWebrequest vous devez ajouter
maintenant, le code ressemblera à:
}