"Unable to connect to remote server fail" in HttpWebRequest
Ich bin mit VSTS 2008 + C# + .Net 3.5 zu entwickeln, um eine Konsole-Anwendung, und ich sende Anfrage an einen anderen server (IIS 7.0 unter Windows Server 2008). Ich finde, wenn die Anzahl der Anfrage-threads sind groß (z.B. 2000 threads), der client wird die Fehlermeldung "Unable to connect to remote server Fehler" beim Aufruf von response = (HttpWebResponse)request.GetResponse().Meine Verwirrung ist -- ich habe timeout auf einen großen Wert, aber ich habe solche nicht-bestanden-Meldung innerhalb von einer minute. Ich denke, auch wenn die Verbindung wirklich größer als das, was IIS dienen könnten, client, sollten Sie nicht bekommen, wie nicht-bestanden-Meldung so bald, sollte es eine solche Nachricht nach der timeout-Zeit. Irgendwelche Kommentare? Irgendwelche Ideen, was falsch ist? Irgendwelche Ideen, um eine größere Anzahl von gleichzeitigen Anschluss serviert wird, die von IIS 7.0?
Hier ist mein code,
class Program
{
private static int ClientCount = 2000;
private static string TargetURL = "http://labtest/abc.wmv";
private static int Timeout = 3600;
static void PerformanceWorker()
{
Stream dataStream = null;
HttpWebRequest request = null;
HttpWebResponse response = null;
StreamReader reader = null;
try
{
request = (HttpWebRequest)WebRequest.Create(TargetURL);
request.Timeout = Timeout * 1000;
request.Proxy = null;
response = (HttpWebResponse)request.GetResponse();
dataStream = response.GetResponseStream();
reader = new StreamReader(dataStream);
//1 M at one time
char[] c = new char[1000 * 10];
while (reader.Read(c, 0, c.Length) > 0)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
}
finally
{
if (null != reader)
{
reader.Close();
}
if (null != dataStream)
{
dataStream.Close();
}
if (null != response)
{
response.Close();
}
}
}
static void Main(string[] args)
{
Thread[] workers = new Thread[ClientCount];
for (int i = 0; i < ClientCount; i++)
{
workers[i] = new Thread((new ThreadStart(PerformanceWorker)));
}
for (int i = 0; i < ClientCount; i++)
{
workers[i].Start();
}
for (int i = 0; i < ClientCount; i++)
{
workers[i].Join();
}
return;
}
}
InformationsquelleAutor George2 | 2009-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kev beantwortet Sie die Frage bereits, ich möchte nur hinzufügen, dass die Schaffung von so vielen threads ist nicht wirklich eine gute Lösung für das design (nur Kontext-switching-overhead ist ein großer minus) plus es wird nicht skaliert gut.
Die schnelle Antwort wäre: Verwendung asynchroner Operationen zum Lesen von Daten erstellen, anstatt eine Reihe von threads. Oder zumindest mit thread-pool (und niedriger worker-thread-count). Denken Sie daran, dass Sie mehr verbindungen zu einer Quelle wird nur die Geschwindigkeit Dinge bis zu einem gewissen Grad. Versuchen Sie, benchmarking und Sie werden sehen, dass wahrscheinlich 3-5-verbindungen schneller, die 2000 die Sie jetzt verwenden.
Lesen Sie mehr über asynchrone client - /server-Architektur (IOCP - Eingabe - /Ausgabe-completion-ports) und seine Vorteile hier. Sie können von hier aus starten:
MSDN - Über eine Asynchrone Server-Socket
MSDN - Asynchrone Server-Socket Beispiel
CodeProject - Multi-threaded .NET TCP Server Beispiele
Alle diese Beispiele verwendet untere Ebene TCP-Objekt, aber es kann angewendet werden, um WebRequest/WebResponse als gut.
UPDATE
Versuchen-thread-pool-version, können Sie etwas wie das hier tun:
Nicht getestet, eventuell einige Anpassungen.
Sie sollten wirklich versuchen es selbst. Ich bin mir nicht sicher, ob es Sie profitieren in diesem Fall (da dies für die load testing, also nicht wirklich die Leistung wichtig ist), aber Sie werden etwas neues zu lernen (-. Aktualisierte Antwort mit thread-pool-Beispiel.
Ich habe eine Verwandte Frage ist hier, begrüßen, wenn Sie könnten, take ein look. Dank stackoverflow.com/questions/1600002/...
InformationsquelleAutor Audrius
Ich Schätze, du hast ausgereizt, die web-site der Warteschlange des Anwendungspools. Der Standardwert ist 1000 Anfragen, Sie überschwemmen den server mit 2000 Anfragen mehr oder weniger alle auf einmal. Die Erhöhung der timeout ist nicht zu lösen.
Erhöhen Sie die Länge der Warteschlange für den Anwendungspool der Website befindet.
Sollten Sie versuchen, und erfassen die zugrunde liegenden HTTP-status, das gibt Ihnen einen Hinweis darauf, was wirklich vor sich geht.
Update:
Wenn ich Ihren code und versuchen Sie es und laden Sie eine beträchtliche Datei (200 MB) bekomme ich
(503) Server Unavailable.
. Die Erhöhung der Größe der der Anwendungspool-Anfrage-Warteschlange löst dieses Problem (ich meine 10000).Nur einmal sah ich
Unable to connect to remote server
und leider auch nicht in der Lage zu replizieren. Dieser Fehler klingt wie es ist etwas kaputt in der TCP/IP-Schicht. Kannst du die vollständige Ausnahme?Wie ich sagte iis.net forum, HTTP-Fehler Protokolle enthalten die Informationen.
Danke Kev für "Application Pool die Warteschlange löst dieses Problem", meinst du den IIS-Manager => Application-pools => Erweiterte Einstellungen => die Länge der Warteschlange?
Eine andere Frage ist, was ist der gleichzeitige client # verwendest du? 2000?
IIS-Manager => Application-pools => Erweiterte Einstellungen => die Länge der Warteschlange, die ich meine. Ich bin mit mit ClientCount = 2000. Was throttle-rate-Einstellungen verwenden Sie?
InformationsquelleAutor Kev
Gehen Smart Thread Pool und downlod der code. Es ist eine Instanz von thread-pool, schränkt die Anzahl der threads. Die .Net-Thread-pool kann problematisch sein in Anwendungen, die eine Verbindung zu web-Servern und SQL-Servern.
Ändern Sie die Schleife, um diese
Dies schränkt den thread pool-1-thread-pro proc. Justieren Sie diese, bis die Leistung sinkt. Zu viele threads sind noch schlimmer als zu wenige. Sie finden viele, dass dies optimal ist.
Auch zu Ihnen config. Der Wert 100 ist eine Standardeinstellung, die ich verwende. Es ist ein Weg, um dies in den code, aber die syntax entgeht mir jetzt.
Warum "Das .Net-Thread-pool kann problematisch sein in Anwendungen, die eine Verbindung zum web-Server und SQL-Server."?
InformationsquelleAutor Gary
Ich benutze Visual Studio 2005. So verschicken Sie eine SMS, hier ist mein code:
InformationsquelleAutor thainese victoria