未发送请求

问题描述 投票:11回答:5

当我从应用程序中使用API​​时遇到了一个奇怪的问题。有时,无缘无故,只是没有发送该请求,并且在超时结束时失败,并显示以下错误:

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."

我尝试了许多API,例如NSURLConnection委托,NSURLSessionNSURLConnection.sendSynchronousRequest,但均未成功。

这里是一个示例项目,旨在突出这一问题。 ConnectionBugApp

以下是复制步骤:

  • 以Xcode运行该应用程序并停止调试,以便该应用程序在您的手机上
  • 打开应用程序,单击测试连接(成功,加载轮立即停止旋转)
  • 转到其他应用程序,例如facebook / twitter /网络游戏(有些笨重),然后几次切换到飞行模式
  • 返回到我的应用程序,然后单击“测试连接”(加载轮永远不会停止)

一些细节可能会有所帮助:

  • 如果我使用服务器IP而不是域名,则会成功

  • 问题仅在LTE / 4G网络上出现

任何想法或解决方法,将不胜感激!随时询问更多详细信息。

谢谢

编辑

[自从我第一次发布描述以来,我对它进行了很多编辑(希望使其更清晰,更清晰),如果某些答案或评论不再有意义,我感到抱歉。

ios swift ios8 nsurlconnection
5个回答
2
投票

我在使用异步请求时遇到了这个问题。似乎iOS将开放连接的数量限制为单个域,以使所有后续连接都按照您描述的方式失败。

如果连接通常快速完成,则可能不会有问题。

解决方案是将打开的连接数限制到同一域,以防止发生这种情况。

karlos发布的答案之所以有效,是因为连接的同步性阻止了其他人被打开。


2
投票

就像评论中提到的那样,我在托管服务上启用了DNSSEC(缓存中毒保护)。

禁用它可以解决此问题,即使这可能不是一个很好的解决方案。经过几周的搜索,就足够了。

我将赏金提供给可以解释它的人,或者可以提供更好解决方案的人。


1
投票

在您的代码中,您的请求默认超时时间为60秒,但是您可以如下在代码中更改“请求超时”。

在您的NetworkItem类更改超时中。

init(request:NSMutableURLRequest){
    self.request = request
    self.request.timeoutInterval = 120
    super.init()
}

0
投票

尝试以下连接代码。这将为您提供帮助。

      let urlData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)

            if error != nil || urlData!.length == 0
            {
                println("Error happend timeout======\(error?.code)!")

                continue
            }
            else //else1
            {if let httpResponse = response as? NSHTTPURLResponse
                {
                    println("Status Code for successful---\(httpResponse.statusCode)")

                    // For example 502 is for Bad Gateway
                    if (httpResponse.statusCode == 502)
                    {
                        // Check the response code from your server and break
                        break
                    }
                    else
                    {

                        //Your code
                     }
            }
    }

您可以在以下链接中获取HTTPS状态代码列表StatusCode


0
投票

所以,在2019年,我们遇到了类似的问题。当服务器上的“ KeepAliveTimeout”设置为小于30时,似乎出现问题。解决方法是将标题“连接”设置为“关闭”。

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