没有连接,因为目标机器主动拒绝它?

时间:2010-06-04 08:41:19

标签: c# .net asp.net-web-api2 socketexception system.net.webexception

有时在我对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();

30 个答案:

答案 0 :(得分:174)

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

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

当您等待在侦听套接字上accept时,您将被置于待办事项中。这个积压是有限的而且非常短 - 值为1,2或3并不罕见 - 因此操作系统可能无法将您的'accept'请求排队。

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

如果您编写了服务器,那么在接受套接字时可能需要进行大量处理,这可以更好地移动到单独的工作线程中,这样您的接受就可以随时接收连接。您可以探索各种架构选择,以减少排队客户端并按顺序处理它们。

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

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

答案 1 :(得分:29)

最可能的原因是防火墙。

This article包含一系列原因。它可能对你有用。

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

  • FTP服务器设置
  • 软件/个人防火墙设置
  • 多个软件/个人防火墙
  • 防病毒软件
  • LSP Layer
  • 路由器固件
  • 计算机已关闭
  • 计算机未插入

答案 2 :(得分:14)

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

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

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

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

  

转到Web service项目的属性 - >点击网络标签 - >在服务器部分 - >检查特定端口   然后分配主项目调用Web服务的standard port number

我希望这能解决问题。

干杯:)

答案 3 :(得分:6)

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

答案 4 :(得分:4)

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

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

答案 5 :(得分: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";
        }

    }

答案 6 :(得分:3)

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

答案 7 :(得分:2)

在我的情况下,一些域工作,而有些域没有。在我的web.config中添加对组织的代理Url的引用修复了问题。

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

答案 8 :(得分:2)

转到您的WCF项目 - 属性 - &gt; Web - &gt; 调试器   - &GT;取消选中复选框

  

启用编辑并继续

答案 9 :(得分:2)

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

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地址下连接。 (由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,但它适用于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;
        }
    }

答案 10 :(得分:2)

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

Net.Pipe.Listener.Adapter

Net.TCP.Listener.Adapter

Net.Tcp端口共享服务

答案 11 :(得分:2)

好吧,我今天在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(don& #39;知道最近如何或最近将其复制回"Program Files/MySQL/MySQL Server 5.6"

自MySQL工作以来,系统的唯一变化是安装了Native Instruments&#39; Traktor 2和Traktor Audio 2声卡,它真的不应该引起这个问题,除了我之外没有其他人使用过这个系统。如果有人有任何线索,那么你和我以及遇到过此事的任何人都会发表评论以防止这种情况发生。

答案 12 :(得分:2)

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

  1. 重新启动工作站

  2. 重建您的解决方案

  3. 更新WCFclient项目中的服务引用
  4. 此时,我收到了消息(Windows 7)以允许系统访问。 然后,服务引用已正确更新,没有错误。

答案 13 :(得分:2)

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

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

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

[1] http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacacheexception.aspx

答案 14 :(得分:1)

当您调用仅具有HTTP(例如:http://example.com)的服务并调用HTTPS(例如:https://example.com)时,您将得到此错误-“无法建立连接,因为目标计算机积极拒绝”

答案 15 :(得分:1)

还有一种可能性 -

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

$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”放在浏览器地址栏中,首先根据您的参数修改脚本。

答案 18 :(得分:0)

我现在正面临着这个事情...

enter image description here

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

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

答案 19 :(得分:0)

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

“ MongoDB Service”进程未在Services中运行

以Administrator身份启动cmd并输入

net start MongoDB

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

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

enter image description here

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

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

希望有帮助。

答案 22 :(得分:0)

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

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

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

我认为我会发布此消息,以防它对某人有所帮助。

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

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

答案 25 :(得分:0)

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

答案 26 :(得分:0)

我从我的网络层引用位于WCFHost上的服务时收到此错误。对我有用的东西可能并不适用于所有人,但我会为那些可能的人留下这个答案。我的WCFHost的端口号是由IIS随机更新的,我只需要在我的web配置中更新到svc引用的结束路由。问题解决了。

答案 27 :(得分:0)

在Windows 7家庭高级版64位上使用WampServer 64位我遇到了这个问题。经过数小时和数小时的实验后,很明显所需要的只是在my.ini中注释掉一行。然后它工作正常。

注释掉了1行 插座= MySQL的

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

答案 28 :(得分:0)

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

  1. 运行提示,输入services.msc并按Enter
  2. 查找服务名称 - SQL Server Agent实例名称
  3. 如果SQL Server Agent未运行,请双击该服务以打开属性窗口。然后单击Start按钮。希望它会帮助别人。

答案 29 :(得分:0)

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

  • App1
  • App2的
  

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

     

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

     

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

进行侦听