无法连接,因为目标计算机主动拒绝了吗?


260

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


System.Net.WebException:无法连接到远程服务器---> System.Net.Sockets.SocketException:无法建立连接,因为目标计算机主动拒绝它127.0.0.1:80
   在System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,SocketAddress socketAddress)
   在System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
   在System.Net.ServicePoint.ConnectSocketInternal处(布尔型connectFailure,Socket s4,Socket s6,Socket&套接字,IPAddress&地址,ConnectSocketState状态,IAsyncResult asyncResult,Int32超时,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
我刚刚尝试连接到Azure。可以肯定地说目标计算机可用。重新启动和路由器重置后问题仍然存在。奇怪的。问题?提琴手没有正确关闭。系统仍希望通过Fiddler路由流量,而这是“目标机器”不可用。
Vok

这与所使用的插座有关吗?您在出口关闭吗?
George Sp

Answers:


204

如果总是发生这种情况,则从字面上意味着这台机器存在,但没有服务在指定端口上侦听,或者有防火墙阻止您。

如果偶尔发生-您使用了“有时”一词-并且重试成功,则可能是因为服务器具有完整的“积压”。

当您等待accept在侦听套接字上进行教育时,您将被积压。此积压是有限的,而且很短-1、2或3的值并不稀奇-因此,操作系统可能无法将您的“接受”消费请求排队。

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

如果编写服务器,则套接字的接受过程中可能要进行大量处理,最好将其移到单独的工作线程中,以便接受总是准备好接收连接。您可以探索多种体系结构选择,以减轻排队和顺序处理客户端的麻烦。

不管是否可以增加服务器积压,您都确实需要在客户端代码中使用重试逻辑来解决此问题-因为即使积压很长时间,服务器当时可能在该端口上接收到许多其他请求。

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


是的,我偶尔会收到(并非总是如此),我不认为原因是防火墙或其他原因,但积压可能是此问题的原因。反正有解决这个问题的方法吗?
hsnkvk 2010年

@hsnkvk; 正确的健壮方法是使客户端具有重试循环;答案相应的更新
威尔

@将; 我已经有一个迭代计数,如果失败,我会重试迭代计数时间。:(
hsnkvk 2010年

1
就是这样 如您所说,设计/配置不当是相当模糊的。通过代码检查,您是否意味着要查看调用Web服务的代码?我没有将它发布为与调用第一个Web服务的代码完全相同的代码,并且该代码运行完美。服务器上是否可以通过web.config配置任何属性,这可能会影响第二个Webapp?
Amith George

9
127.0.0.1:80建议Web服务位于本地计算机上,这会导致网络问题。非常高兴的是,在测试过程中,Web服务的启动速度比客户端应用程序的启动速度慢。仍然添加重试逻辑无疑是要走的路。
马丁·布朗

31

最可能的原因是防火墙。

本文包含一系列原因,可能对您有用。

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

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

9
我知道这很旧,但是您可以将Fiddler添加到此列表中。在应用程序启动期间分离提琴手,然后重新连接使我的套接字正常工作。
ps2goat

1
提琴手
竖起

3
我在开发机器上安装了提琴手,这导致了此问题,运行此特定项目时我没有打开提琴手,并得到了错误。当我在运行项目时打开提琴手时,它起作用了
Peter PitLock

16

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

当您有多个项目的副本时,通常会发生此问题

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

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

转到Web service项目的属性->单击“ Web”选项卡->在“ 服务器”部分->“检查特定端口” ,然后分配standard port number主项目调用Web服务所依据的端口

我希望这可以解决问题。

干杯:)


2
这对我来说不是常识。我一直为为什么我的错误指定错误感到困惑LocalHost:2532。原来是您指定区域中的先前所有者以这种方式设置的。既然已经知道了这个谜,那么其他一些事情就变得不那么神秘了。谢谢!
Suamere 2014年

7

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


这是典型的Windows 7问题吗?与其他Windows版本相比,某些默认设置是否有所不同?

@狼,我认为这不是Windows问题。但是,这可能是连接问题。
isaeid '16

转到IE-> Internet选项->连接选项卡-> LAN设置,取消选中“为LAN使用代理服务器”。这为我解决了问题。
Mike Kuenzi

在我的应用程序中,我包括一个代理选项(WPAD),因为用户可能需要它。我不。但是,我在测试计算机上激活了它,这将导致失败。因此,如果您不必使用代理,则可以不在应用程序中定义代理。
凌晨



3

使用Net TCP绑定的WCF服务出现相同的错误,但在我的情况下启动以下服务后已解决。

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Net.Tcp端口共享服务


1
太棒了,我正在拔头发。脚注:在Windows 7 PC上运行WCF NET.TCP服务不需要运行这3个服务。但是,在Windows Server上运行(我测试2003和2008),这些服务必须要运行WCF能够正确的。
smirkingman,2015年

3

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


3

我遇到了同样的错误,因为当服务器和客户端在同一台计算机上运行时,客户端需要服务器本地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的规则。
Darkseal

3

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

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

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


谢谢。附带说明一下,当我启动服务时,它似乎可以正常工作,但将来会给我自己和其他人带来参考,但是该应用程序出现了种种缓慢情况,最后我决定(d'uh)该服务在AppFabric的另一台服务器上集群未打开。
2015年

2

好吧,我今天是第一次在Windows 8 64位操作系统上突然收到此错误,结果证明my.ini已重置,并且bin / mysqld文件已删除,等等。在"Program Files/MySQL/MySQL Server 5.6"文件夹中。

要解决此问题,我必须再次运行MySQL安装程序,仅安装服务器,然后从中复制my.ini文件的最新版本("ProgramData/MySQL/MySQL Server 5.6"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不可用,因此您需要重新启动计算机才能再次使用它。
加百利2015年

2

供解决方案内的服务参考。

  1. 重新启动工作站

  2. 重建您的解决方案

  3. 在WCFclient项目中更新服务参考

在这一点上,我收到了使系统访问允许的消息(Windows 7)。然后,服务参考已正确更新,没有错误。


2

我想分享这个答案,因为问题的原因不是防火墙或进程未正确侦听,而是我使用的Microsoft提供的代码示例。

https://msdn.microsoft.com/zh-cn/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地址下。(由Microsoft提供)

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的IPV4,但是它可以与localhost,127.0.0.1和您网卡的实际IP地址一起使用,而Microsoft提供的示例在此失败!

    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;
        }
    }

2

就我而言,有些域名有效,有些则无效。在我的web.config中添加对组织的代理Url的引用即可解决此问题。

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

1

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


1

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

  • 应用1
  • 应用2

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

错误:启动App1并尝试收听不存在的鬼镇时,会产生错误

解决方案:首先启动App2,然后尝试使用App1收听


1

另一种可能性-

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


1

在我的情况下,这是由于错误的部署导致的,其中没有在我的web.config中进行设置。

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

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

我以为我会发布此邮件,以防它对某人有所帮助。


0

在Windows 7 Home Premium 64bit上使用WampServer 64bit我遇到了这个确切的问题。经过数小时的实验,很明显,所有需要的内容都在my.ini中以注释掉一行。然后工作正常。

注释掉1行socket = mysql

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


0

我经常遇到这个问题。我发现SQL Server Agent服务未运行。手动启动该服务后,它便已修复。仔细检查服务是否正在运行:

  1. 运行提示,键入services.msc并按回车
  2. 查找服务名称- SQL Server Agent实例名称

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


为什么SQL Server代理与IIS有关系?也许您的意思是WWW服务?
Nick.McDermaid

0

我遇到此错误,花了一些时间解决。在我的情况下,我在同一端口上将https和net.tcp配置为IIS绑定。显然,您不能在同一端口上有两件事。我使用netstat -ap tcp命令检查该端口上是否有监听的东西。没有人在听。删除不必要的绑定(以我的情况为https)解决了我的问题。


0

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


0

有一个称为“ SQL Server浏览器”的服务,该服务向客户端提供SQL Server连接信息。

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


0

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

在此处输入图片说明

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

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

希望能帮助到你。


0

可能是由于授权问题;对我来说就是这样。如果您有例如:[Authorize("WriteAccess")][Authorize("ReadAccess")]在控制器功能的顶部,请尝试将其注释掉。


0

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

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

以Administrator身份启动cmd并输入,

net start MongoDB

只需查看mongoDB即可启动并运行,只需在mond中键入mongo,它将提供Mongo版本详细信息和Mongo Connection URL


0

我现在正好面对这个...

在此处输入图片说明

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.