Der Zielcomputer verweigert aktiv die Verbindung, was dazu führt, dass keine Verbindung hergestellt werden kann.
P粉268654873
P粉268654873 2023-08-20 12:40:57
0
1
446
<p>Manchmal tritt der folgende Fehler auf, wenn ich HttpWebRequest an einen Webdienst ausführe. Ich habe auch meinen Code unten kopiert. </p> <hr /> <pre>System.Net.WebException: Es konnte keine Verbindung zum Remote-Server hergestellt werden ---> System.Net.Sockets.SocketException: Die Verbindung konnte nicht hergestellt werden, da der Zielcomputer 127.0.0.1:80 aktiv abgelehnt hat bei System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) bei System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP) bei System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& Socket, IPAddress& Adresse, ConnectSocketState-Status, IAsyncResult asyncResult, Int32-Timeout, Exception& Ausnahme) --- Ende des inneren Ausnahme-Stack-Trace --- bei System.Net.HttpWebRequest.GetRequestStream() </pre> <hr /> <pre class="brush:php;toolbar:false;">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) brechen; reqWriter.Write("&"); parList = parList.Substring(index01 + 1); } } } anders { request.ContentLength = 0; } Antwort = (HttpWebResponse)request.GetResponse();</pre> <p><br /></p>
P粉268654873
P粉268654873

Antworte allen(1)
P粉852114752

如果这种情况总是发生,那么这实际上意味着机器存在,但指定端口上没有服务在监听,或者有防火墙阻止你。

如果这种情况偶尔发生 - 你使用了"有时候"这个词 - 并且重试成功,那很可能是因为服务器的'backlog'已满。

当你等待在一个监听套接字上被接受时,你会被放置在一个backlog中。这个backlog是有限的,非常短 - 值为1、2或3并不罕见 - 所以操作系统可能无法将你的请求排队等待'accept'来消费。

backlog是listen函数的一个参数 - 所有的语言和平台在这方面基本上都有相同的API,甚至包括C#。如果你控制服务器,这个参数通常是可配置的,并且可能从某个配置文件或注册表中读取。请了解如何配置你的服务器。

如果你编写了服务器,你可能在套接字的接受过程中有很重的处理,这可以更好地移动到一个单独的工作线程中,这样你的接受总是准备好接收连接。你可以探索各种架构选择来减轻客户端的排队和顺序处理。

无论如何,无论你是否可以增加服务器的backlog,你的客户端代码都需要重试逻辑来应对这个问题 - 因为即使有一个很长的backlog,服务器在那个时间可能仍然会接收到很多其他端口的请求。

有一种罕见的可能性是,如果NAT路由器的映射端口耗尽,会出现此错误。不过我认为这种可能性太小了,因为路由器在耗尽之前可以同时建立64K个到相同目标地址/端口的连接。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!