Manchmal erhalte ich den folgenden Fehler, während ich HttpWebRequest zu einem WebService tat. Ich habe auch meinen Code unten kopiert.
System.Net.WebException: Verbindung zum entfernten Server konnte nicht hergestellt werden ---> System.Net.Sockets.SocketException: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer sie aktiv abgelehnt hat 127.0.0.1:80 at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP) at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception) --- Ende des inneren Ausnahme-Stacktrace --- at System.Net.HttpWebRequest.GetRequestStream()
ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.PreAuthenticate = true;
request.Credentials = networkCredential(sla);
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/x-www-form-urlencoded";
request.Timeout = v_Timeout * 1000;
if (url.IndexOf("asmx") > 0 && parStartIndex > 0)
{
AppHelper.Logger.Append("#############" + sla.ServiceName);
using (StreamWriter reqWriter = new StreamWriter(request.GetRequestStream()))
{
while (true)
{
int index01 = parList.Length;
int index02 = parList.IndexOf("=");
if (parList.IndexOf("&") > 0)
index01 = parList.IndexOf("&");
string parName = parList.Substring(0, index02);
string parValue = parList.Substring(index02 + 1, index01 - index02 - 1);
reqWriter.Write("{0}={1}", HttpUtility.UrlEncode(parName), HttpUtility.UrlEncode(parValue));
if (index01 == parList.Length)
break;
reqWriter.Write("&");
parList = parList.Substring(index01 + 1);
}
}
}
else
{
request.ContentLength = 0;
}
response = (HttpWebResponse)request.GetResponse();
Wenn dies immer der Fall ist, bedeutet dies, dass der Rechner zwar existiert, aber keine Dienste auf dem angegebenen Port lauschen, oder dass eine Firewall Sie daran hindert.
Wenn es gelegentlich auftritt - Sie haben das Wort "manchmal" verwendet - und ein erneuter Versuch erfolgreich ist, liegt es wahrscheinlich daran, dass der Server einen vollen 'Backlog' hat.
Wenn Sie darauf warten, an einem lauschenden Socket akzeptiert zu werden, befinden Sie sich in einem Backlog. Dieses Backlog ist endlich und recht kurz - Werte von 1, 2 oder 3 sind nicht ungewöhnlich - und so ist das Betriebssystem möglicherweise nicht in der Lage, Ihre Anfrage in eine Warteschlange zu stellen, damit die 'accept' verbraucht werden kann.
Das Backlog ist ein Parameter der Funktion listen
- alle Sprachen und Plattformen haben im Grunde die gleiche API in dieser Hinsicht, sogar die C#. Dieser Parameter ist oft konfigurierbar, wenn Sie den Server kontrollieren, und wird wahrscheinlich aus einer Einstellungsdatei oder der Registrierung gelesen. Untersuchen Sie, wie Sie Ihren Server konfigurieren können.
Wenn Sie den Server geschrieben haben, kann es sein, dass Sie eine umfangreiche Verarbeitung im Accept des Sockets haben, die besser in einen separaten Worker-Thread verschoben werden sollte, damit Ihr Accept immer bereit ist, Verbindungen zu empfangen. Es gibt verschiedene Möglichkeiten der Architektur, die es erlauben, Clients in eine Warteschlange zu stellen und sie sequentiell zu verarbeiten.
*Unabhängig davon, ob Sie den Server-Backlog erhöhen können, benötigen Sie eine Wiederholungs-Logik in Ihrem Client-Code, um mit diesem Problem fertig zu werden - denn selbst bei einem langen Backlog könnte der Server zu diesem Zeitpunkt viele andere Anfragen auf diesem Port erhalten.
Es besteht die seltene Möglichkeit, dass ein NAT-Router diesen Fehler ausgibt, wenn seine Ports für Mappings erschöpft sind. Ich denke, wir können diese Möglichkeit als zu weit hergeholt verwerfen, da der Router bis zur Erschöpfung 64K gleichzeitige Verbindungen zur gleichen Zieladresse/zum gleichen Port zulässt.
Der wahrscheinlichste Grund ist eine Firewall.
Dieser Artikel enthält eine Reihe von Gründen. Er könnte für Sie nützlich sein.
Aus dem Artikel geht hervor, dass mögliche Gründe sein könnten:
Das ist mir auch passiert... Manchmal, wenn ich mein Projekt öffne, wird dieser Fehler angezeigt, was frustrierend ist. Das Problem war, dass manchmal die Port-Nummer des Webdienstes wurde unerwartet ändern.
Dieses Problem tritt normalerweise auf, wenn Sie mehr als eine Kopie des Projekts haben
Mein Projekt rief den Webdienst mit einer bestimmten Portnummer auf, die ich in der Datei Web.Config meiner Hauptprojektdatei zugewiesen hatte. Da sich die Portnummer unerwartet änderte, war der Browser nicht in der Lage, den Webdienst zu finden und gab diesen Fehler aus.
Ich löste dies, indem ich die folgenden Schritte befolgte: (Visual Studio 2010)
Gehen Sie zu den Eigenschaften des Projekts "Webdienst"; klicken Sie auf die Registerkarte Web; klicken Sie im Abschnitt Server auf Spezifischer Port und weisen Sie dann die Standard-Portnummer zu, über die Ihr Hauptprojekt den Webdienst aufruft.
Ich hoffe, dass damit das Problem gelöst ist.
Prost :)