9
votes

Plusieurs requêtes HTTP en C #

Je dois envoyer environ 200 demandes HTTP en parallèle à différents serveurs et obtenir une réponse. J'utilise la classe httpwebrequest en C #. Mais je ne vois pas l'amélioration du temps lorsque les demandes sont traitées en parallèle. Par exemple, si une requête a besoin de 3 secondes pour obtenir une réponse, 2 demandes parallèle - 6Sec, 3 demandes - 8 secondes, 4 demandes - 11Sec ... Ce n'est pas bon, j'espère qu'il devrait y avoir le meilleur temps, environ 10 secondes pour 200 demandes. Il semble que seulement 2-3 demandes effectue en parallèle, mais le délai d'attente commence immédiatement après la création d'objets WebRequest. J'ai essayé de définir defaultconnectionLimit code> et maxservicePoints code> valeurs, mais je n'ai pas aidé. Comme je comprends ces paramètres pour le nombre de demandes d'un site en parallèle. J'ai besoin de demandes à différents sites.

Exemple de code que j'utilise pour tester: P>

ArrayList a = new ArrayList(150);

for (i = 50; i < 250; i++ )
{
   a.Add("http://207.242.7." + i.ToString() + "/");
}

for (i = 0; i < a.Count; i++)
{
    Thread t = new Thread(new ParameterizedThreadStart(performRequest));
    t.Start(a[i]);
}


static void performRequest(object ip)
{
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create((stirng)ip);

      HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
}


1 commentaires

J'ai moi-même un problème similaire, il semble que webrequest.create () réutiliser la même connexion TCP pour une raison quelconque. Je me demande si vous avez découvert quelle est la réponse à votre question?


5 Réponses :


0
votes

Utilisez des demandes Web asynchrones à Stead.

Edit: http://msdn.microsoft. COM / EN-US / Bibliothèque / 86WF6409 (vs.71) .aspx


0 commentaires

3
votes

Au lieu de démarrer vos propres threads Essayez d'utiliser les méthodes asynchrones de httpwebrequest tels que httpwebrequest.begingreesponse et httpwebrequest.begingetreQuestStream .


1 commentaires

J'ai déjà une application multithread et doit exécuter ces demandes dans des threads déjà créés. Ce n'est qu'un exemple de code. Point est que lorsque les threads font partie de WebRequest.Create et GetResponse Actions Porfomance est très très lente. Aussi avant la demande HTTP, j'effectue une connexion TCP dans les mêmes threads sur le port de Sever's 80 pour savoir que le port est ouvert ou fermé et cela fonctionne très vite.



4
votes

Cela pourrait aider - http://social.msdn.microsoft.com/forums/en-us/netfxnetcom/thread/1f863f20-09f9-49A5-8F9-49A5-8FEE-17A89B591007

suggère qu'il existe une limite sur le nombre de connexions TCP autorisées, mais que vous pouvez augmenter la limite


3 commentaires

Plus de détails ici aussi - Arnosoftwaredev.blogspot.com/2006/ 09 / ... C'est presque certainement le problème de votre frappe


Bien que .. Vos liens semblent faire référence à des connexions simultanées à One Host , et à partir de l'exemple de la question, l'OP apporte des connexions à plusieurs hôtes différents ... est-ce le cas ou que .NET a Une limite de connexion maximale à n'importe quel hôte aussi?


@Patrick pense que vous avez un point. Dépend Je suppose que si les 200 de ses demandes vont à différents serveurs ou disent 10 au premier serveur, 20 à la prochaine, 5 à la prochaine, etc., cela frapperait le problème. Sinon, ce n'est peut-être pas le problème. Vaut un essai au moins



0
votes


Vous pouvez essayer ceci:
xxx


0 commentaires

-3
votes

Ceci est le code d'application Android d'envoi de la demande. Comment pouvons-nous utiliser le code supérieur comme: xxx


0 commentaires