连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败

Posted

技术标签:

【中文标题】连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败【英文标题】:A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed 【发布时间】:2015-07-17 12:18:40 【问题描述】:

我有一个问题:

连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应 URL。

我也遇到类似的问题:

System.IO.IOException: 无法将数据写入传输连接:现有连接被远程主机强行关闭

System.Net.WebException: 操作在 System.Net.WebClient.UploadFile(Uri address, String method, String fileName) 处超时

我知道以前有人问过这个问题,但相信我,我几乎尝试了每一个解决方案。

奇怪的是这个问题根本不会出现在我的最后,只有当客户尝试使用它时才会出现。有时我的应用程序最终也能正常工作。

我想要完成的是我创建了一个桌面应用程序(Win Forms 和 C#)并尝试登录客户端,同时向我托管在 GODaddy 上的 php api 服务器发送请求。

var request = (HttpWebRequest)WebRequest.Create("url");
if (request != null)

    #region System.Net.WebException
    request.Method = "POST";
    if (!string.IsNullOrEmpty(body))
    
        var requestBody = Encoding.UTF8.GetBytes(body);
        request.ContentLength = requestBody.Length;
        request.ContentType = "application/json";
        using (var requestStream = request.GetRequestStream())
        
            requestStream.Write(requestBody, 0, requestBody.Length);
        
    
    else
    
        request.ContentLength = 0;
    
    request.Timeout = 15000;
    request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);

    string output = string.Empty;
    try
    
        using (var response = (HttpWebResponse)request.GetResponse())
        
            using (var stream = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1252)))
            
                if (response.StatusCode == HttpStatusCode.OK)
                
                    while (!stream.EndOfStream)
                    
                        output += stream.ReadLine();
                    
                    output = stream.ReadToEnd();
                
            
        
    
    catch
    
        // Excaption Caught here
    

请帮帮我。

提前致谢。

【问题讨论】:

如果它总是在您的终端上运行,并且有时只在您的客户端运行,这可能是防火墙问题,但它是 http...您是否为 HttpWebRequests 使用了除 80 和 443 之外的其他端口?使用 ping 测试客户端和服务器之间的响应时间,以确保它们没有超时或丢包 我的 httpWebRequest 没有使用任何端口。此外,我无法从客户的机器上使用 ping,因为我没有访问权限。 这将很难解决。代码看起来不错,你说它确实对你有用,有时也对他们有用。我不知道怎么做,但您必须对网络连接进行故障排除,以确保不是问题所在。抱歉,我无法提供更多帮助。 @waltmagic,我知道这很难。我也发现很难调试。但是你说的 HttpWebRequest 端口呢?如果它有帮助,您可以看到在客户端发生任何问题时我得到的内部异常: System.Net.WebException:WebClient 请求期间发生异常。 ---> System.IO.IOException: Unable to write data to the transport connection: 一个现有的连接被远程主机强行关闭。 ---> System.Net.Sockets.SocketException: 远程主机在 System.Net.Sockets.Socket.Send(Byte[] buffer 处强行关闭了现有连接 默认端口是 80 和 443,大多数防火墙都允许这些端口,因为这些端口是为 http 保留的。如果您可能导致错误(访问您客户的网络),您可以调试并进入您的应用程序,直到代码断开连接,然后您就会知道发生了什么。 【参考方案1】:

我想我得到了答案。想把它贴出来,以便对其他人有所帮助。

这很可能是特定的机器问题或服务器问题,但在我的情况下,我尝试设置 Request.proxy = null 并且它就像一个魅力。

【讨论】:

你在哪里添加的?【参考方案2】:

尝试添加这个...

request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.ServicePoint.ConnectionLimit = 12;

MSDN 文章建议每个 CPU 有 12 个连接,因此限制为 12,因为它由 GoDaddy 托管,所以我确信服务器资源是有限的。

【讨论】:

谢谢,但我已经尝试过了@waltmagic。但是,在我的情况下,问题是否可能发生在服务器端:GoDaddy?我怎样才能知道它的服务器端或代码问题? 老实说,我认为它在服务器端...我认为正在建立连接,然后出现问题。您可以编辑您的 api 以在连接关闭或断开时进行记录,这肯定会有所帮助。您可以调试并单步执行您的程序以查找桌面应用程序中的问题。 非常感谢@waltmagic。我将上述决议,并让你知道。

以上是关于连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败的主要内容,如果未能解决你的问题,请参考以下文章

连接尝试失败,因为连接方在一段时间后没有正确响应 - VB

SQLSTATE[HY000] [2002] 连接尝试失败,因为连接方在一段时间后没有正确响应,

System.Net.Sockets.SocketException (10060):连接尝试失败,因为连接方在一段时间后没有正确响应

System.Net.Sockets.SocketException

如何从不同的位置向eventhub发布事件?

UWP C#异步套接字服务器不能接受