目标计算机积极拒绝,无法建立连接?

371
有时我在对 WebService 进行 HttpWebRequest 操作时会遇到以下错误,下面是我复制的代码:
System.Net.WebException: 无法连接到远程服务器---> System.Net.Sockets.SocketException: 由于目标计算机积极拒绝,无法建立连接 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();

3
我刚刚连接到Azure时遇到了这个问题。可以非常肯定地说,目标机器可用。重启和路由器重置后问题仍然存在,很奇怪。出问题的原因是Fiddler没有正确关闭。系统仍然期望通过Fiddler来路由流量,而这就是不可用的“目标机器”。 - Vok
这可能与使用的套接字有关吗?您在退出时关闭它们了吗? - George Sp
Xampp或Ampps => 启动/停止Mysql连接 - undefined
32个回答

261
如果这种情况总是发生,那就意味着机器存在,但指定端口上没有服务在监听,或者有防火墙阻止了你。
如果这种情况偶尔发生 - 你使用了“有时候”这个词 - 并且重试成功,很可能是因为服务器有一个完整的“backlog”(待处理队列)。
当你等待在一个监听套接字上被接受时,你被放置在一个待处理队列中。这个待处理队列是有限的,而且非常短 - 值为1、2或3并不罕见 - 所以操作系统可能无法将你的请求排队等待“accept”来处理。
待处理队列是“listen”函数的一个参数 - 所有的语言和平台在这方面基本上都有相同的API,甚至包括C#。如果你控制服务器,这个参数通常是可配置的,并且可能从某个设置文件或注册表中读取。请调查如何配置你的服务器。
如果你编写了服务器,你可能会在套接字的接受过程中有大量的处理工作,这时最好将其移到一个单独的工作线程中,这样你的接受过程就始终准备好接收连接。你可以尝试不同的架构选择来减轻客户端排队和顺序处理的问题。
无论你是否能增加服务器的后备队列,你的客户端代码都需要具备重试逻辑来应对这个问题,因为即使有一个很长的后备队列,服务器在同一端口上可能会同时接收到很多其他请求。
有一种罕见的可能性是,如果NAT路由器的端口映射用尽,就会出现这个错误。不过我认为这种可能性太小了,因为路由器在耗尽之前可以同时建立64K个与相同目标地址/端口的连接。

1
那就是关键所在。像你说的那样,设计/配置不良相当模糊。通过代码检查,您是要查看调用Web服务的代码吗?我没有发布它,因为它与调用第一个Web服务的代码完全相同,而且那个代码完美地工作。是否有任何可以通过web.config配置的服务器属性可能会影响第二个Web应用程序? - Amith George
13
127.0.0.1:80 表示网络服务在本地机器上,这使得网络问题不太可能出现。很可能的情况是,在测试期间,网络服务启动比客户端应用程序慢。仍然,加入重试逻辑无疑是正确的方法。 - Martin Brown
有人能提供一个在.NET MVC网站中可用的重试代码示例吗? - Rono
@Will,根据“在资源耗尽之前对同一目的地地址/端口进行64K个同时连接”的说法,您的意思是每个端口可以有64k个连接吗? - Pacerier
1
又回到这里了。我想再加上一个+1! - Chris W
显示剩余8条评论

47

最有可能的原因是防火墙。

这篇文章列出了一些可能有用的原因。

根据这篇文章,可能的原因有:

  • FTP服务器设置
  • 软件/个人防火墙设置
  • 多个软件/个人防火墙
  • 反病毒软件
  • LSP层
  • 路由器固件
  • 计算机关机
  • 计算机未插入电源
  • Fiddler

16
我知道这个内容有点过时了,但你可以把 Fiddler 加入到列表中。在应用程序启动期间分离 Fiddler,然后重新连接它,可以使我的 sockets 正常工作。 - ps2goat
5
我在开发机上安装了 Fiddler,这导致了这个问题。当我运行这个特定的项目时,我没有打开 Fiddler,但是却收到了错误提示。当我在运行项目时打开了 Fiddler,它就正常工作了。 - Peter PitLock

22

我也遇到了同样的问题。这是因为 Web 服务的端口号意外更改了。

如果您有多个项目的副本,则通常会出现此问题。

我的项目正在调用使用我在主项目文件的 Web.Config 文件中分配的特定端口号的 Web 服务。由于端口号意外更改,浏览器无法找到 Web 服务并抛出该错误。

我通过以下步骤解决了这个问题:(Visual Studio 2010)

转到 Web 服务 项目的属性 -> 点击 Web 选项卡 -> 在 服务器 部分 -> 选择 指定端口号,然后指定您的主项目使用的标准端口号来调用 Web 服务。

希望这可以解决问题。

干杯 :)


3
对我来说这不是常识。一直以来,我困惑不已,不知道为什么我的错误会指定“LocalHost:2532”。原来是前任在你指定的区域设置了它。现在这个谜团已经解开,其他一些事情也就不再神秘了。谢谢! - Suamere

8

我认为您需要检查“Internet选项”中的代理设置。如果您正在使用代理服务器或“隐藏IP”应用程序,则可能出现此问题。


这是一个典型的Windows 7问题吗?与其他Windows版本相比,有一些默认设置不同吗? - Wolf
@Wolf,我认为这不是Windows的问题。但是,可能是连接问题。 - isaeid
打开IE->Internet选项->连接选项卡->局域网(LAN)设置,取消勾选“使用代理服务器”。这个方法对我来说解决了问题。 - Mike Kuenzi
在我的应用程序中,我包含了一个代理选项(WPAD),因为用户可能需要它。但是,我在我的测试计算机上激活了它,这会导致失败。因此,如果您不必使用代理,您可以不在应用程序中定义它。 - tmighty

5

我也曾在使用Net TCP绑定的WCF服务时遇到同样的错误,但在我的情况下启动以下服务后问题得以解决。

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Net.Tcp Port Sharing Service


2
太棒了,我都快抓狂了。注:在Windows 7 PC上运行我的WCF NET.TCP服务不需要这3个服务运行。然而,在Windows Server上运行(我测试了2003和2008),这些服务必须运行才能使WCF正常工作。 - smirkingman

5
当您调用只有HTTP(例如:http://example.com)的服务并调用HTTPS(例如:https://example.com)时,您会得到这个错误——“无法建立连接,因为目标计算机积极拒绝了它”。

4

2
问题中没有提到关于Selenium服务器的任何内容。 - Geoff Dawdy
1
@GeoffDawdy 这只是Will的回答中第一条原因的又一个例子 - 通过重复支持学习;-) - Wolf

4

在我的情况下,有些域名可用,有些则不行。在我的web.config文件中添加了对组织代理Url的引用后,问题得到解决。

<system.net>
    <defaultProxy useDefaultCredentials="true">
      <proxy proxyaddress="http://proxy.my-org.com/" usesystemdefault="True"/>
    </defaultProxy>
</system.net>

3

对我来说,我想在 shell 中启动 mongo(与问题的确切上下文无关,但甚至在开始在 shell 中启动 mongo 之前就出现了相同的错误消息)

在“服务”中未运行“MongoDB 服务”进程

以管理员身份启动 cmd 并输入:

net start MongoDB

只需在cmd中输入mongo即可查看MongoDB是否已启动,它将提供Mongo版本详细信息和Mongo连接URL。


3

在使用AppFabric的应用程序中,我遇到了这个错误。提示是在堆栈跟踪中得到一个DataCacheException。为确定是否出现该问题,请运行以下PowerShell命令:

@("AppFabricCachingService","RemoteRegistry") | % { get-service $_ }

如果这两个服务中的任意一个停止运行,那么您将会收到这个错误提示。

谢谢。顺便提一下,对于我和其他人的未来参考,当我启动服务时,它似乎工作正常,但应用程序出现了各种缓慢,最后我终于意识到(咦)AppFabric集群中另一台服务器上的服务没有开启。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接