无法建立连接,因为目标计算机主动拒绝它127.0.0.1:3446

问题描述 投票:65回答:15

我正在使用WCF4.0模板-REST。我正在尝试创建一个使用流上传文件的方法。

问题总是发生在

Stream serverStream = request.GetRequestStream();

流媒体类:

namespace LogicClass
{
    public class StreamClass : IStreamClass
    {
        public bool UploadFile(string filename, Stream fileStream)
        {
            try
            {
                FileStream fileToupload = new FileStream(filename, FileMode.Create);
                byte[] bytearray = new byte[10000];
                int bytesRead, totalBytesRead = 0;
                do
                {
                    bytesRead = fileStream.Read(bytearray, 0, bytearray.Length);
                    totalBytesRead += bytesRead;
                } while (bytesRead > 0);

                fileToupload.Write(bytearray, 0, bytearray.Length);
                fileToupload.Close();
                fileToupload.Dispose();
            }
            catch (Exception ex) { throw new Exception(ex.Message); }
            return true;
        }
    }
}

REST项目:

[WebInvoke(UriTemplate = "AddStream/{filename}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
public bool AddStream(string filename, System.IO.Stream fileStream)
{
    LogicClass.FileComponent rest = new LogicClass.FileComponent();
    return rest.AddStream(filename, fileStream);
}

Windows窗体项目:用于测试

private void button24_Click(object sender, EventArgs e)
{
    byte[] fileStream;
    using (FileStream fs = new FileStream("E:\\stream.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        fileStream = new byte[fs.Length];
        fs.Read(fileStream, 0, (int)fs.Length);
        fs.Close();
        fs.Dispose();
    }

    string baseAddress = "http://localhost:3446/File/AddStream/stream.txt";
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(baseAddress);
    request.Method = "POST";
    request.ContentType = "text/plain";
    Stream serverStream = request.GetRequestStream();
    serverStream.Write(fileStream, 0, fileStream.Length);
    serverStream.Close();
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        int statusCode = (int)response.StatusCode;
        StreamReader reader = new StreamReader(response.GetResponseStream());
    }
}

我关闭了防火墙和我的Internet连接,但错误仍然存​​在。有没有更好的方法来测试上传方法?

堆栈跟踪:

System.Net.Socket.Net.Service.ConnectSocketInternal上的System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,SocketAddress socketAddress)(布尔值connectFailure,套接字s4,套接字s6,套接字和套接字,IP地址和地址,ConnectSocketState状态,IAsyncResult asyncResult,Int32超时,异常和例外)

c# wcf rest httpwebrequest
15个回答
126
投票

“主动拒绝它”意味着当您尝试连接时,主机发送了重置而不是确认。因此,您的代码不是问题。有防火墙阻止连接或托管服务的进程没有侦听该端口。这可能是因为它根本没有运行,或者因为它正在侦听不同的端口。

一旦启动托管服务的进程,请尝试使用netstat -anb(需要管理员权限)来验证它是否正在运行并侦听预期的端口。

更新:在Linux上,您可能需要改为使用netstat -anp


0
投票

有了这个错误,我能够跟踪它,感谢@Yaur,您需要基本检查服务(WCF)是否正在运行,还要检查高级防火墙设置上的出站和入站TCP属性。


0
投票

我在我的网络服务器上遇到了同样的问题“无法建立连接,因为目标机器主动拒绝了它161.x.x.235:5672”。我要求管理员在Web服务器上打开端口5672,然后它运行正常。


0
投票

使用类似的模式,我的rest客户端调用服务API,调试时调用的服务成功,但不处理已发布的代码。错误是:无法连接到远程服务器。

内部异常:System.Net.Sockets.SocketException(0x80004005):无法建立连接,因为目标计算机在System.Net上的System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,SocketAddress socketAddress)主动拒绝了它的serviceIP:443 .ServicePoint.ConnectSocketInternal(Boolean connectFailure,Socket s4,Socket s6,Socket&socket,IPAddress&address,ConnectSocketState state,IAsyncResult asyncResult,Exception&exception)

解决方案:在Web配置中设置代理。

<system.net>
    <defaultProxy useDefaultCredentials="true">
      <proxy proxyaddress="http://proxy_ip:portno/" usesystemdefault="True"/>
    </defaultProxy>
</system.net>

0
投票

我也在C#中使用.Net Remoting Service遇到了问题。

我通过3个步骤解决了它:

  1. 在所有文件中更改协议端口,无论它在何处使用。
  2. 运行您的Host Server程序并使其处于活动状态。
  3. 现在运行您的客户端程序。

0
投票

我有一个类似的问题。在我的案例VPN代理应用程序,如Psiphon,更改了Windows中的代理设置,请按照下列步骤操作:

在Windows 10中,搜索更改代理设置并在手动代理中使用代理服务器


0
投票

确保您的应用程序使用的所有服务都已启用,这些服务正在使用主机和端口来使用它们。例如,在我的情况下,可能会出现此错误,如果您的应用程序正在使用Redis服务器并且无法在给定端口和主机上连接它,从而产生此错误。


11
投票

您不必重新启动PC。改为重新启动IIS。

运行 - >'cmd'(作为管理员)并输入“iisreset”


2
投票

我得到类似的错误消息,如TCP错误代码10061:无法建立连接,因为目标计算机在我当前的项目中主动拒绝它。我发现这个10061错误代码无法区分服务端点未启动的情况和防火墙阻止它的情况。通常,防火墙可以关闭,但问题仍然存在。

您可以通过以下两种方式测试代码。

  1. 插入代码以获取时间A服务启动以及客户端将请求发送到服务器的时间B.如果B早于A,则可能导致此问题。
  2. 将服务器端口更改为系统中也可用的另一个端口。您会发现报告的错误代码相同。

以上是我的修复。它适用于我的机器。我希望它有所帮助!


1
投票

检查是否有其他程序正在使用该端口。

如果同一程序的实例仍处于活动状态,则终止该进程。


1
投票

我有一个类似的问题。在我的情况下,该服务在开发人员计算机上可以正常工作,但在QA计算机上会失败。事实证明,在QA机器上,应用程序没有以管理员身份运行,也没有注册端点的权限:

HTTP无法注册URL http://+:12345/Foo.svc/]。您的进程没有此命名空间的访问权限(有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=70353)。

请参考此处了解如何在不成为管理员用户的情况下使其工作:https://stackoverflow.com/a/885765/38258


1
投票

如果您使用WCF风暴,您甚至可以登录到WCF服务端点吗?如果没有,并且您在Windows服务中托管它,您可能忘记注册该命名空间。这个步骤是必需的,并没有很好地宣传,这实际上很烦人。

我用this tool to do this;它可以自动完成所有繁琐的步骤。


1
投票

我有一个类似的问题拒绝localhost和127.0.0.1。 cmd(admin)netstat -anb发现端口运行在169.254.80.80(不知道是因为我的网络ip是10.0.0.5而来的,因为我的网络ip是10.0.0.5。放入这个IP后它工作了。这给了正确的IP:

IPAddress ipAddress = ipHostInfo.AddressList[0];
Console.WriteLine(ipAddress.ToString());

1
投票

您必须设置您的系统代理您必须通过此路径控制面板>> Internet选项>>连接>> LAN设置>>代理无tik:使用代理服务器


0
投票

检查网页文件Web.config中的端口号是否与IIS上托管的端口号相同。

© www.soinside.com 2019 - 2024. All rights reserved.