请求未发送

Request not sent

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

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

我尝试了很多 API,例如 NSURLConnection 委托,NSURLSessionNSURLConnection.sendSynchronousRequest 都没有成功。

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

重现步骤如下:

一些可能有帮助的细节:

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

谢谢

编辑

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

尝试以下代码 connection.This 会对您有所帮助。

      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状态码列表link StatusCode

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

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

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

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

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

在你的 NetworkItem class 更改超时。

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

如评论中所述,我在托管服务上启用了 DNSSEC(缓存中毒保护)。

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

我会将悬赏奖励给可以解释它或提供更好解决方案的人。