【问题标题】:Request not sent请求未发送
【发布时间】:2015-07-20 20:45:13
【问题描述】:

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

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

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

这是我为突出问题而制作的示例项目。 ConnectionBugApp

以下是重现的步骤:

  • 在 Xcode 中运行应用并停止调试,以便应用在您的手机上
  • 打开应用,点击测试连接(成功,加载轮立即停止转动)
  • 去脸书/推特/网络游戏等其他应用(有些有点重)并切换到飞行模式几次
  • 回到我的应用并点击测试连接(加载轮永远不会停止)

一些可能有帮助的细节:

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

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

任何想法或解决方法将不胜感激!欢迎询问更多详情。

谢谢

编辑

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

【问题讨论】:

  • 如果你使用 NSURLSession API,问题会重现吗?
  • @LeoNatan,是的,我对NSURLSession也有同样的问题
  • 你在服务器端看到了什么?您是否看到服务器接受客户端连接或什至没有到达服务器?我会说它看起来像是在您的服务器中的某个地方,您正在断开连接。也许是防火墙。
  • @LeoNatan,我相信它没有到达服务器,日志中没有任何内容。 (而我可以看到客户是否被拒绝)。就像我在帖子中提到的那样,如果我锁定设备,则在我解锁后立即发送请求。
  • 您在一台网络服务器上是否有任何其他网络服务器没有的安全措施?

标签: ios swift ios8 nsurlconnection


【解决方案1】:

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

如果连接通常很快完成,这可能不是问题。

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

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

【讨论】:

  • 感谢您的回答,karlos 的建议不起作用。如果我还可以添加,我在每个响应中都有一个Connection:close 标头,我相信这是我使用其他应用程序使请求无法执行的事实。就像操作系统将我的应用程序及其连接置于后台并忘记唤醒它一样。
  • 您是否尝试为 https 请求添加超时?
  • 你的意思是当我发起我的请求时?是的,它有 120 秒的超时时间。
  • 只需将其缩短到 10 秒,然后尝试打印响应。通常在应用程序中超时时间约为 60 秒。
  • @karlos 是的,我增加了它来看看发生了什么,一开始是 30 秒,结果是一样的。
【解决方案2】:

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

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

我会把赏金给能解释它的人,或者能提供更好解决方案的人。

【讨论】:

【解决方案3】:

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

在您的NetworkItem 班级更改超时。

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

【讨论】:

  • 感谢您的回答,但这不是超时时间问题。当它失败时,无论持续时间是多少,它总是在超时结束时失败。
【解决方案4】:

尝试使用以下代码进行连接。这会对您有所帮助。

      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

【讨论】:

  • 感谢您的回答,我不确定您发布此代码的原因,不幸的是我遇到了同样的问题。
  • 我在 LTE/4G 连接上尝试了 ConnectionBugApp,它适用于“tripaff.com”和“meetsam.co”网址。 “ip.jsontest.com”网址出现错误 503。
  • 嗯,你在其他应用上密集使用网络后尝试过吗?您也可以尝试忘记该应用几个小时,然后再点击尝试连接按钮。
  • 我尝试了重新连接,并为“tripaff.com/”正常工作;和“meetsam.co/”以及“ip.jsontest.com/”的错误 503。
猜你喜欢
  • 1970-01-01
  • 2020-08-19
  • 2021-05-29
  • 2021-04-27
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多