因为目标机器主动拒绝而无法建立连接?

Posted

技术标签:

【中文标题】因为目标机器主动拒绝而无法建立连接?【英文标题】:No connection could be made because the target machine actively refused it? 【发布时间】:2020-10-07 04:14:57 【问题描述】:

有时我在对 WebService 执行 HttpWebRequest 时收到以下错误。我也在下面复制了我的代码。


System.Net.WebException:无法连接到远程服务器---> System.Net.Sockets.SocketException:无法建立连接,因为目标机器主动拒绝它 127.0.0.1:80 在 System.Net.Sockets.Socket.DoConnect(端点 endPointSnapshot,SocketAddress socketAddress) 在 System.Net.Sockets.Socket.InternalConnect(端点 remoteEP) 在 System.Net.ServicePoint.ConnectSocketInternal(布尔连接失败、套接字 s4、套接字 s6、套接字和套接字、IPAddress 和地址、ConnectSocketState 状态、IAsyncResult asyncResult、Int32 超时、异常和异常) --- 内部异常堆栈跟踪结束 --- 在 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();

【问题讨论】:

我刚刚遇到了这个与 Azure 的连接。可以肯定地说目标机器可用。重启和路由器重置后问题仍然存在。诡异的。问题? Fiddler 没有正确关闭。系统仍然希望通过 Fiddler 路由流量,而这就是不可用的“目标机器”。 这可能与使用的套接字有关吗?你会在出口处关闭它们吗? 【参考方案1】:

如果这种情况总是发生,它的字面意思是机器存在,但它没有在指定端口上监听服务,或者有防火墙阻止你。

如果它偶尔发生——你使用了“有时”这个词——并且重试成功,很可能是因为服务器有一个完整的“积压”。

当您在侦听套接字上等待accepted 时,您将被置于积压中。这个积压是有限的并且很短 - 1、2 或 3 的值并不少见 - 因此操作系统可能无法将您的请求排队等待“接受”消费。

积压是listen函数上的一个参数——所有语言和平台在这方面都有基本相同的API,即使是C# one。如果您控制服务器,则此参数通常是可配置的,并且可能从某些设置文件或注册表中读取。研究如何配置您的服务器。

如果您编写了服务器,您的套接字的接受可能会有繁重的处理,这可以更好地移动到单独的工作线程,以便您的接受始终准备好接收连接。您可以探索多种架构选择,以减少客户端排队并按顺序处理它们。

无论是否可以增加服务器积压,您确实需要在客户端代码中使用 重试 逻辑来处理此问题 - 如即使有很长的积压,当时服务器也可能在该端口上接收到许多其他请求。

如果 NAT 路由器的映射端口用尽,则极少有可能出现此错误。我认为我们可以放弃这种可能性,因为路由器在耗尽之前有 64K 同时连接到相同的目标地址/端口。

【讨论】:

是的,我偶尔会得到它,并非总是如此,我不认为原因是防火墙或其他任何原因,但积压可能是这个问题的原因。有没有办法解决这个问题? @hsnkvk;正确的健壮方法是让客户端有一个重试循环;答案相应更新 @Will;我已经有一个迭代计数,如果它失败,我会重试迭代计数。 :( 就是这样。正如你所说,糟糕的设计/配置相当模糊。通过代码检查,您的意思是要查看调用 Web 服务的代码吗?我没有将其发布为与调用第一个 Web 服务的代码完全相同并且运行完美的代码。服务器上是否有可以通过 web.config 配置的可能影响第二个 webapp 的属性? 127.0.0.1:80 表明 Web 服务在本地计算机上,这使得网络问题不太可能发生。很可能是在测试时 Web 服务的启动速度比客户端应用程序慢。仍然添加重试逻辑肯定是要走的路。【参考方案2】:

最可能的原因是防火墙。

This article 包含一组原因,可能对您有用。

从文章中,可能的原因可能是:

FTP 服务器设置 软件/个人防火墙设置 多个软件/个人防火墙 杀毒软件 LSP 层 路由器固件 计算机已关闭 计算机未插入 提琴手

【讨论】:

我知道这是旧的,但您可以将 Fiddler 添加到此列表中。在应用程序启动期间分离提琴手,然后重新连接使我的套接字正常工作。 我在开发机器上安装了提琴手,这导致了这个问题,我在运行这个特定项目时没有打开提琴手并得到错误。当我在运行项目时打开 fiddler 时,它起作用了【参考方案3】:

这也发生在我身上。有时当我打开我的项目时,会出现这个错误,这令人沮丧。问题是有时 Web 服务的端口号会意外更改。

当您拥有多个项目副本时,通常会出现此问题

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

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

转到Web service项目的属性-->点击Web选项卡-->在服务器部分-->检查特定端口强> 然后分配standard port number,您的主项目将通过该standard port number 调用Web 服务。

我希望这能解决问题。

干杯:)

【讨论】:

这对我来说不是常识。我一直很困惑为什么我的错误为我指定了LocalHost:2532。原来它是由您指定区域的前任所有者设置的。既然这个谜团已经清楚了,它就让其他一些事情变得不那么神秘了。谢谢!【参考方案4】:

我认为,您需要在“互联网选项”中检查您的代理设置。如果您正在使用代理/“隐藏 ip”应用程序,则可能会出现此问题。

【讨论】:

这是典型的 Windows 7 问题吗?与其他 Windows 版本相比,某些默认设置是否不同? @Wolf,我认为这不是 Windows 问题。但是,可能是连接问题。 转到 IE -> Internet 选项 -> 连接选项卡 -> LAN 设置,取消选中“为 LAN 使用代理服务器”。这解决了我的问题。 在我的应用程序中,我包含了一个代理选项 (WPAD),因为用户可能需要它。我不。但是,我在测试计算机上激活了它,这会导致失败。因此,如果您不必使用代理,则可能不会在您的应用程序中定义一个。【参考方案5】:

我遇到了同样的问题。问题是我没有启动硒服务器。我已经下载了 selenium 服务器并启动了它。启动 selenium 服务器后,问题消失了,一切正常。

请参考:http://coding-issues.blogspot.in/2012/11/no-connection-could-be-made-because.html

【讨论】:

这个问题没有提到硒服务器。 @GeoffDawdy 这只是Will's answer 的原因 #1 的另一个示例 - 支持通过重复学习 ;-)【参考方案6】:

我在使用 Net TCP 绑定的 WCF 服务中遇到了同样的错误,但在我的情况下启动以下服务后解决了。

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Net.Tcp 端口共享服务

【讨论】:

太棒了,我正在拔头发。脚注:在 Windows 7 PC 上运行我的 WCF NET.TCP 服务不需要运行这 3 个服务。但是,在 Windows Server 上运行(我测试了 2003 和 2008)这些服务必须运行,WCF 才能更正。【参考方案7】:

在我的情况下,有些域有效,而有些则没有。在我的 web.config 中添加对我组织的代理 URL 的引用解决了这个问题。

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

【讨论】:

【参考方案8】:

我遇到了同样的错误,因为当您的服务器和客户端在同一台机器上运行时,客户端需要服务器本地 IP 地址而不是公共 IP 地址来与服务器通信,您需要公共 IP 地址,仅当服务器和客户端在不同的机器上运行时,请使用客户端程序中的本地ip地址与服务器连接本地ip地址可以使用此方法找到。

 public static string Getlocalip()
    
        try
        
            IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
            return localIPs[7].ToString();
        
        catch (Exception)
        

            return "null";
        

    

【讨论】:

这是我的方案:作为替代解决方案,如果您指向解析为公共 IP 的主机名,您可能还需要编辑服务器计算机的 HOST 文件并添加路由规则你的主机名到 127.0.0.1。【参考方案9】:

我在使用 AppFabric 的应用程序中遇到此错误。线索是在堆栈跟踪中获得DataCacheException。要查看这是否是您的问题,请运行以下 PowerShell 命令:

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

如果这两个服务中的任何一个被停止,那么您将收到此错误。

【讨论】:

谢谢。作为旁注,为了将来对我自己和其他人的参考,它似乎在我启动该服务时工作,但该应用程序运行缓慢,我最终(d'uh)指出该服务AppFabric 群集中的另一台服务器上未打开。【参考方案10】:

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

【讨论】:

【参考方案11】:

好吧,我今天第一次在 Windows 8 64 位上收到这个错误,结果我的 my.ini 已被重置,bin/mysqld 文件已被删除,在"Program Files/MySQL/MySQL Server 5.6" 文件夹中的其他项目中。

要修复它,我不得不再次运行 MySQL 安装程序,只安装服务器,并从 "ProgramData/MySQL/MySQL Server 5.6" 复制最新版本的 my.ini 文件,在我的例子中命名为 my_2014-03-28T15-51-20.ini(不知道如何或者为什么最近被复制到那里)回到"Program Files/MySQL/MySQL Server 5.6"

自从 MySQL 工作以来,系统的唯一变化是安装了 Native Instruments 的 Traktor 2 和 Traktor Audio 2 声卡,这真的不应该导致这个问题,除了我之外没有其他人使用过这个系统。如果有人有线索,请您发表评论以防止我和其他遇到此问题的人发生这种情况。

【讨论】:

我遇到了同样的问题,解决这个问题的方法是通过 services.msc 停止 MyQsl 服务。但是,之后你的 MySql 将不可用,所以你需要重新启动计算机才能再次使用它。【参考方案12】:

用于解决方案中的服务参考。

    重新启动工作站

    重建您的解决方案

    更新 WCFclient 项目中的服务引用

此时,我收到了允许系统访问的消息 (Windows 7)。 然后服务引用被正确更新,没有错误。

【讨论】:

【参考方案13】:

我想分享我找到的这个答案,因为问题的原因不是防火墙或进程没有正确监听,而是我使用了微软提供的代码示例。

https://msdn.microsoft.com/en-us/library/system.net.sockets.socket%28v=vs.110%29.aspx

我几乎完全按照所写的方式实现了这个功能,但是发生了这个错误:

2016-01-05 12:00:48,075 [10] 错误 - 错误是:System.Net.Sockets.SocketException (0x80004005):无法建立连接,因为目标机器主动拒绝它 [fe80::caa :745:a1da:e6f1%11]:4080

此代码表示套接字已连接,但不在正确通信实际所需的正确 IP 地址下。 (微软提供)

private static Socket ConnectSocket(string server, int port)
    
        Socket s = null;
        IPHostEntry hostEntry = null;

        // Get host related information.
        hostEntry = Dns.GetHostEntry(server);

        // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
        // an exception that occurs when the host IP Address is not compatible with the address family
        // (typical in the IPv6 case).
        foreach(IPAddress address in hostEntry.AddressList)
        
            IPEndPoint ipe = new IPEndPoint(address, port);
            Socket tempSocket = 
                new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            tempSocket.Connect(ipe);

            if(tempSocket.Connected)
            
                s = tempSocket;
                break;
            
            else
            
                continue;
            
        
        return s;
    

我重新编写了代码,只使用它找到的第一个有效 IP。我只关心 IPV4 使用它,但它适用于 localhost、127.0.0.1 和你网卡的实际 IP 地址,微软提供的示例失败了!

    private Socket ConnectSocket(string server, int port)
    
        Socket s = null;

        try
        
            // Get host related information.
            IPAddress[] ips;
            ips = Dns.GetHostAddresses(server);

            Socket tempSocket = null;
            IPEndPoint ipe = null;

            ipe = new IPEndPoint((IPAddress)ips.GetValue(0), port);
            tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            Platform.Log(LogLevel.Info, "Attempting socket connection to " + ips.GetValue(0).ToString() + " on port " + port.ToString());
            tempSocket.Connect(ipe);

            if (tempSocket.Connected)
            
                s = tempSocket;
                s.SendTimeout = Coordinate.HL7SendTimeout;
                s.ReceiveTimeout = Coordinate.HL7ReceiveTimeout;
            
            else
            
                return null;
            

            return s;
        
        catch (Exception e)
        
            Platform.Log(LogLevel.Error, "Error creating socket connection to " + server + " on port " + port.ToString());
            Platform.Log(LogLevel.Error, "The error is: " + e.ToString());
            if (g_NoOutputForThreading == false)
                rtbResponse.AppendText("Error creating socket connection to " + server + " on port " + port.ToString());
            return null;
        
    

【讨论】:

【参考方案14】:

这确实很具体,但是如果您在尝试使用 mongo 连接到数据库后收到此错误,那么对我有用的是在运行 mongo.exe 之前运行 mongod.exe,然后连接工作正常。希望这对某人有所帮助。

【讨论】:

【参考方案15】:

另一种可能性--

确保您尝试打开与您正在收听的 IP 地址相同的 IP 地址。我的服务器应用程序正在使用 IPv6 侦听主机的 IP 地址,但客户端正在尝试连接主机的 IPv4 地址。

【讨论】:

【参考方案16】:

对我来说,我想在 shell 中启动 mongo(与问题的确切上下文无关,但在 shell 中启动 mongo 之前有相同的错误消息)

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

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

net start MongoDB

查看 MongoDB 是否已启动并运行,只需键入 mongo,在 cmd 中将提供 Mongo 版本详细信息和 Mongo 连接 URL

【讨论】:

【参考方案17】:

我从我的 Web 层引用位于 WCFHost 上的服务收到此错误。对我有用的可能并不适用于所有人,但我将把这个答案留给可能的人。我的 WCFHost 的端口号由 IIS 随机更新,我只需将最终路由更新到我的 web 配置中的 svc 引用。问题解决了。

【讨论】:

【参考方案18】:

在我的场景中,我有两个应用程序:

App1 App2

假设:App1 应该监听 App2 在 5000 端口上的活动

错误:启动 App1 并尝试监听一个不存在的鬼城,会产生错误

解决方法:先启动App2,再尝试使用App1监听

【讨论】:

【参考方案19】:

转到您的 WCF 项目 - 属性-> -> 调试器 -> 取消勾选复选框

启用编辑并继续

【讨论】:

这是做什么的?【参考方案20】:

在我的情况下,这是由于未在我的 web.config 中进行设置的错误部署造成的。

一位同事解释说,错误信息中的IP地址代表本地主机。

当我更正 web.config 时,我使用正确的 url 进行服务器调用并且它工作正常。

我想我会发布这个以防它可能对某人有所帮助。

【讨论】:

你能提到 webconfig 中的哪些变化吗?【参考方案21】:

在 Windows 7 Home Premium 64bit 上使用 WampServer 64bit 我遇到了这个确切的问题。经过数小时的实验,很明显,只需要在 my.ini 中注释掉一行即可。然后效果很好。

注释掉 1 行 套接字=mysql

如果您将旧的 /data/ 文件放在适当的位置,WampServer 将接受所有这些文件,但它覆盖的 /mysql/ 文件夹除外。因此,我只需从我之前的开发环境中导入 /mysql/ 用户数据的备份,然后在 phpMyAdmin SQL 窗口中运行 FLUSH PRIVILEGES。效果很好。一定有问题,因为事情不应该这么简单。

【讨论】:

【参考方案22】:

我经常遇到这个问题。我发现SQL Server Agent 服务没有运行。一旦我手动启动服务,它就得到了修复。仔细检查服务是否正在运行:

    运行提示符,输入services.msc 并回车 查找服务名称 - SQL Server Agent(实例名称)

如果SQL Server Agent 没有运行,双击服务打开属性窗口。然后点击Start 按钮。希望它会对某人有所帮助。

【讨论】:

为什么 SQL Server 代理与 IIS 有任何关系?也许你的意思是 WWW 服务?【参考方案23】:

我遇到了这个错误并花了一些时间来解决它。就我而言,我将 https 和 net.tcp 配置为同一端口上的 IIS 绑定。显然你不能在同一个端口上有两个东西。我使用 netstat -ap tcp 命令检查该端口上是否有东西在监听。没有人在听。删除不必要的绑定(在我的例子中是 https)解决了我的问题。

【讨论】:

【参考方案24】:

这是一个愚蠢的问题,我在 web.config 中添加了一个 defaultproxy 以拦截 Fiddler 中的流量,然后忘记删除它!

【讨论】:

【参考方案25】:

有一个名为“SQL Server Browser”的服务向客户端提供 SQL Server 连接信息。

就我而言,现有解决方案均无效,因为该服务未运行。我恢复了它,一切都恢复正常。

【讨论】:

【参考方案26】:

我今天遇到了这个问题。我的是 Asp.Net Core API,它使用Postgresql 作为数据库。我们已将此数据库配置为 Docker 容器。所以我做的第一步是检查我是否能够访问数据库。为此,我在开始时搜索了PgAdmin,因为我已经配置了相同的内容。单击生成的应用程序会将您重定向到http://127.0.0.1:23722/browser/。在那里,您可以尝试在左侧菜单中访问您的数据库。对我来说,我遇到了如下图所示的错误。

输入密码并尝试是否可以访问它。对我来说,它不起作用。因为它是一个 Docker 容器,所以我决定重新启动我的 Docker 桌面,右键单击任务栏中的 docker 图标,然后单击重新启动。

重新启动 Docker 后,我能够登录并看到数据库,并且在 Visual Studio 中重新启动应用程序时错误消失了

希望对你有帮助。

【讨论】:

【参考方案27】:

可能是因为授权问题;我就是这样。 例如,如果您在控制器函数的顶部有:[Authorize("WriteAccess")][Authorize("ReadAccess")],请尝试将它们注释掉。

【讨论】:

【参考方案28】:

我现在才遇到这个......

在这里,我有 2 个独立的 Visual Studio 解决方案 (.sln)...在各自的 Visual Studio 实例中打开每个解决方案。

解决方案 2 调用解决方案 1 代码。问题与分配给解决方案 1 的端口有关。我不得不将解决方案 1 上的端口更改为另一个端口,然后解决方案 2 再次开始工作。因此,请务必检查分配给您的项目的端口。

【讨论】:

【参考方案29】:

通常,连接脚本不会提及要使用的端口。例如:

$mysqli = mysqli_connect('127.0.0.0.1', 'user', 'password', 'database');

因此,要连接不使用端口 3306 的管理器,您必须在连接请求中指定端口号:

$mysqli = mysqli_connect('127.0.0.0.1', 'user', 'password', 'database', '3307');

要检查 MySQL 或 MariaDB 数据库管理器上的连接,请使用以下脚本: wamp(64)\www\testmysql.php 通过在浏览器地址栏中输入“http://localhost/testmysql.php”,首先根据您的参数修改脚本。

【讨论】:

【参考方案30】:

我忘了启动服务,所以它失败了,因为没有服务正在监听端口。 启动服务即可解决。

【讨论】:

以上是关于因为目标机器主动拒绝而无法建立连接?的主要内容,如果未能解决你的问题,请参考以下文章

Errno 10061:无法建立连接,因为目标机器主动拒绝(客户端-服务器)

.NET 4 新的 TCP 客户端无法连接:无法建立连接,因为目标机器主动拒绝它

“无法建立连接,因为目标机器主动拒绝它” Nethereum 异常

无法建立连接,因为目标机器主动拒绝它 127.0.0.1

使用密码验证后弹性搜索`无法建立连接,因为目标机器主动拒绝`

无法使用 monotorrent 下载 torrent(“无法建立连接,因为目标机器主动拒绝它”)