2010-06-04 16 views
8

Ich muss etwa 200 HTTP-Anfragen parallel zu verschiedenen Servern senden und Antwort erhalten. Ich verwende HttpWebRequest Klasse in C#. Aber ich sehe keine gute Zeit Verbesserung, wenn Anfragen parallel behandelt werden. Zum Beispiel, wenn eine Anfrage 3 Sekunden braucht, um eine Antwort zu erhalten, 2 Anfragen parallel - 6 Sekunden, 3 Anfragen - 8 Sekunden, 4 Anfragen - 11 Sekunden ... Es ist nicht gut, ich hoffe, dass es die beste Zeit geben sollte, etwa 10 Sekunden für 200 Anfragen. Es sieht so aus, als ob nur 2-3 Anforderungen parallel ausgeführt werden, aber das Timeout beginnt unmittelbar nach der Erstellung des WebRequest-Objekts. Ich versuchte Set DefaultConnectionLimit und MaxServicePoints Werte, aber ID hat nicht geholfen. Wie ich diese Parameter für die Anzahl der Anfragen an eine Seite parallel verstehe. Ich brauche Anfragen an verschiedene Seiten.Mehrere HTTP-Anfrage in C#

Code-Beispiel, das ich Test verwenden:

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 jemand jemals solch ein Problem aufgetreten? Vielen Dank für Anregungen.

+0

Ich habe ähnliches Problem selbst, scheint es, dass WebRequest.Create() die gleiche TCP-Verbindung aus irgendeinem Grund wiederverwenden. Ich frage mich, ob Sie herausgefunden haben, was die Antwort auf Ihre Frage ist? – ala

Antwort

3

Anstatt Ihre eigenen Threads des Startens versuchen mit Hilfe der asynchronen Methoden der HttpWebRequest wie HttpWebRequest.BeginGetResponse und HttpWebRequest.BeginGetRequestStream. Hilfe

+1

Ich habe bereits Multithread-Anwendung und muss diese Anfragen in bereits erstellten Threads ausführen. Dies ist nur ein Beispielcode. Punkt ist, dass, wenn Threads die WebRequest.Create und GetResponse Aktionen ausführen, porfomance sehr, sehr langsam ist. Auch vor der HTTP-Anfrage führe ich eine TCP-Verbindung in den gleichen Threads auf dem 80-Port des Servers aus, um zu wissen, ob der Port geöffnet oder geschlossen ist, und er arbeitet sehr schnell. – Nikita

2

Dies könnte - http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007

Schlägt vor, gibt es eine Grenze für die Anzahl der TCP-Verbindungen erlaubt, aber dass Sie die Grenze erhöhen

+0

Mehr Details hier auch - http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html Dies ist fast sicher das Problem, das Sie schlagen – ChoccyButton

+0

Obwohl ..Ihre Links scheinen auf gleichzeitige Verbindungen zu * einem * Host zu verweisen, und aus dem Beispiel in der Frage macht das OP Verbindungen zu mehreren verschiedenen Hosts ... Ist das der Fall oder hat .NET ein maximales Verbindungslimit zu * any * Gastgeber auch? – Patrick

+0

@Patrick Denken Sie, Sie haben einen Punkt. Hängt davon ab, wenn alle 200 seiner Anfragen zu verschiedenen Servern gehen oder sagen 10 zu erstem Server, 20 zu nächsten, 5 zu nächsten usw. Das würde das Problem treffen. Sonst ist es vielleicht nicht das Problem. Einen Versuch wert mindestens – ChoccyButton

0


Sie können dies versuchen:

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

Dies ist der Code der Android-Anwendung der sendenden Anfrage. Wie können wir den oberen Code wie params.add (neu BasicNameValuePair ("key", "Wert");

Httppost request = new Httppost();

Liste params = new Arraylist();

params.add (neu BasicNameValuePair ("key", "Wert"); // Wie können wir den Wert in diesem Format Format geben

post.setEntity (neu UrlEncodedFormEntity (params));

httpClient.execute (Anfrage);