有时在对WebService执行HttpWebRequest时收到以下错误。我也复制了下面的代码。
System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 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) --- End of inner exception stack trace --- 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();
最佳答案
如果总是发生这种情况,则从字面上意味着这台机器存在,但没有服务在指定端口上侦听,或者有防火墙阻止您。
如果偶尔发生-您使用了“有时”一词-并且重试成功,则可能是因为服务器具有完整的“积压”。
当等待在监听套接字上被抄送时,您将被积压。此积压是有限的并且很短-值1、2或3并不罕见-因此操作系统可能无法将您的请求接受到队列以接受“接受”。
待办事项是accept
函数上的参数-在这方面,所有语言和平台都具有基本相同的API,即使C# one也是如此。如果您控制服务器,则该参数通常是可配置的,并且很可能从某些设置文件或注册表中读取。研究如何配置服务器。
如果编写服务器,则套接字的接受过程中可能要进行大量处理,最好将其移到单独的工作线程中,以便接受总是准备好接收连接。您可以探索多种体系结构选择,以减轻排队和顺序处理客户端的麻烦。
不管是否可以增加服务器积压,您都确实需要在客户端代码中使用重试逻辑来解决此问题-因为即使积压很长,服务器当时可能会在该端口上收到许多其他请求。
如果NAT路由器的映射端口用尽,则极有可能出现此错误。我认为我们可以将这种可能性视作远景,因为路由器会在耗尽之前将64K同时连接到同一目标地址/端口。
关于c# - 无法连接,因为目标计算机主动拒绝了吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57415950/