Frage Mehrere HTTP-Anfragen in C #


Ich muss ungefähr 200 HTTP-Anforderungen parallel zu verschiedenen Servern senden und Antwort erhalten. Ich verwende die 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 würden nur 2-3 Anforderungen parallel ausgeführt, aber das Zeitlimit beginnt unmittelbar nach der Erstellung des WebRequest-Objekts. Ich habe es versucht 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.

Codebeispiel, das ich zum Testen verwende:

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

Ist jemand jemals auf ein solches Problem gestoßen? Vielen Dank für Anregungen.


8
2018-06-04 09:47


Ursprung


Antworten:


Anstatt eigene Threads zu starten, versuchen Sie die asynchronen Methoden von HttpWebRequest wie HttpWebRequest.BeginGetResponse und HttpWebRequest.BeginGetRequestStream.


3
2018-06-04 09:51



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

Schlägt vor, dass die Anzahl der zulässigen TCP-Verbindungen begrenzt ist, Sie jedoch das Limit erhöhen können


2
2018-06-04 09:52



Verwenden Sie stattdessen asynchrone Webanfragen.

Bearbeiten: http://msdn.microsoft.com/en-us/library/86wf6409(VS.71).aspx


1
2018-06-04 09:50




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

0
2018-06-04 09:59



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

HttpPost Anfrage = neu HttpPost ();

Liste params = new ArrayList ();

params.add (new BasicNameValuePair ("key", "value"); // Wie können wir den Wert in diesem Formatformat angeben?

post.setEntity (neu UrlEncodedFormEntity (params));

httpClient.execute (Anfrage);


-2
2018-02-14 11:05