当我在对一个Web服务进行HttpWebRequest时,有时会得到以下错误。我也复制了下面的代码。
System.Net.WebException:无法连接到远程服务器 ---> System.Net.Sockets.SocketException。因为目标机主动拒绝了127.0.0.1:80,所以无法建立连接。 at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) 在 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) --- 内部异常堆栈跟踪结束 --- 在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的值并不罕见--因此操作系统可能无法为你的请求排队,让'接受'消耗。
积压是listen
函数上的一个参数--所有语言和平台在这方面的API基本相同,即使是C#一。 如果你控制了服务器,这个参数通常是可以配置的,而且很可能是从一些设置文件或注册表中读取的。 调查一下如何配置你的服务器。
如果你写了服务器,你可能在你的套接字的接受中进行了繁重的处理,这可以更好地移到一个单独的工人线程中,这样你的接受就可以随时接收连接。 你可以探索各种架构的选择,以减轻排队的客户端并按顺序处理它们。
*不管你是否能增加服务器的积压,你确实需要在你的客户端代码中加入重试逻辑来应对这个问题--因为即使有很长的积压,服务器当时也可能在该端口上收到很多其他请求。
有一种罕见的可能性,如果NAT路由器的映射端口用完了,它就会出现这种错误。 我想我们可以放弃这种可能性,因为路由器在耗尽之前有64K个同时连接到同一目标地址/端口的可能性,但这是一个太长的机会。
最可能的原因是防火墙。
这篇文章包含了一系列的原因。它可能对你有用。
从这篇文章来看,可能的原因可能是。
我也遇到了这种情况。有时,当我打开我的项目时,这个错误出现了,这让我很沮丧。问题是,有时网络服务的端口号会意外地改变。
这个问题通常发生在你有多个项目副本的时候。
我的项目用一个特定的端口号调用Web服务,这个端口号是我在主项目文件的Web.Config文件中指定的。由于端口号意外地改变了,浏览器无法找到Web服务,并抛出了这个错误。
我通过下面的步骤解决了这个问题。(Visual Studio 2010)
进入 "Web服务 "项目的属性-->点击Web标签-->在服务器部分-->选中特定端口。 然后指定 "标准端口号",你的主项目就是通过这个端口调用网络服务的。
我希望这能解决这个问题。
谢谢 :)