2010-06-04 4 views
8

Je dois envoyer environ 200 requêtes HTTP en parallèle à différents serveurs et obtenir une réponse. J'utilise la classe HttpWebRequest en C#. Mais je ne vois pas de bon temps quand les requêtes sont traitées en parallèle. Par exemple si une requête nécessite 3sec pour obtenir réponse, 2 requête en parallèle - 6sec, 3 requêtes - 8 secs, 4 requêtes - 11sec ... Ce n'est pas bon, j'espère qu'il devrait y avoir le meilleur temps, environ 10 sec pour 200 demandes. Il semble que seulement 2-3 demandes s'exécutent en parallèle, mais le délai commence immédiatement après la création de l'objet WebRequest. J'ai essayé de définir DefaultConnectionLimit et MaxServicePoints valeurs, mais ID n'a pas aidé. Comme je comprends ces paramètres pour le nombre de demandes à un site en parallèle. J'ai besoin de demandes à différents sites.Demande HTTP multiple en C#

Exemple de code que j'utiliser pour tester:

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(); 
} 

Сan quelqu'un a déjà rencontré un tel problème? Merci pour vos suggestions.

+0

J'ai un problème similaire moi-même, 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? – ala

Répondre

3

Au lieu de commencer vos propres fils essayez d'utiliser les méthodes asynchrones de HttpWebRequest tels que HttpWebRequest.BeginGetResponse et HttpWebRequest.BeginGetRequestStream.

+1

J'ai déjà une application multithread et j'ai besoin d'exécuter ces requêtes dans des threads déjà créés. Ceci est seulement un exemple de code. Le point est que lorsque les threads traitent les actions WebRequest.Create et GetResponse, la 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 80 de sever pour savoir que le port est ouvert ou fermé et cela fonctionne très rapidement. – Nikita

2

Cela pourrait aider - http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007

Suggère il y a une limite sur le nombre de connexions TCP autorisés, mais que vous pouvez augmenter la limite

+0

Plus de détails ici aussi - http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html Ceci est presque certainement le problème de votre frappe – ChoccyButton

+0

Bien ..vos liens semblent référencer des connexions simultanées à * un * hôte, et à partir de l'exemple de la question, l'OP établit des connexions avec plusieurs hôtes différents ... Est-ce le cas ou est-ce que .NET a une limite de connexion maximale à * tout * hôte aussi bien? – Patrick

+0

@Patrick Pensez que vous avez un point. Ça dépend si je suppose que toutes ses 200 demandes vont à des serveurs différents ou disent 10 au premier serveur, 20 au suivant, 5 au suivant, etc. Cela réglerait le problème. Sinon, ce n'est peut-être pas le problème. Ça vaut le coup d'essayer au moins – ChoccyButton

0


vous pouvez essayer ceci:

try 
     { 
      List<Uri> uris = new List<Uri>(); 
      uris.Add(new Uri("http://www.google.fr")); 
      uris.Add(new Uri("http://www.bing.com")); 

      Parallel.ForEach(uris, u => 
      { 
       WebRequest webR = HttpWebRequest.Create(u); 
       HttpWebResponse webResponse = webR.GetResponse() as HttpWebResponse; 
      }); 
     } 
     catch (AggregateException exc) 
     { 
      exc.InnerExceptions.ToList().ForEach(e => 
       { 
        Console.WriteLine(e.Message); 
       }); 
     } 
-2

Ceci est le code de l'application Android de la demande d'envoi. Comment peut-on utiliser le code supérieur comme params.add (nouveau BasicNameValuePair ("clé", "valeur");

HttpPost demande = new HttpPost();

Liste params = new ArrayList();

params.add (nouvelle BasicNameValuePair ("clé", "valeur"); // Comment peut-on donner la valeur dans ce format format

post.setEntity (nouveau UrlEncodedFormEntity (params));

httpClient.execute (request);