当我从应用程序中使用API时遇到了一个奇怪的问题。有时,无缘无故,只是没有发送该请求,并且在超时结束时失败,并显示以下错误:
Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."
我尝试了许多API,例如NSURLConnection
委托,NSURLSession
和NSURLConnection.sendSynchronousRequest
,但均未成功。
这里是一个示例项目,旨在突出这一问题。 ConnectionBugApp
以下是复制步骤:
一些细节可能会有所帮助:
如果我使用服务器IP而不是域名,则会成功
问题仅在LTE / 4G网络上出现
任何想法或解决方法,将不胜感激!随时询问更多详细信息。
谢谢
编辑
[自从我第一次发布描述以来,我对它进行了很多编辑(希望使其更清晰,更清晰),如果某些答案或评论不再有意义,我感到抱歉。
我在使用异步请求时遇到了这个问题。似乎iOS将开放连接的数量限制为单个域,以使所有后续连接都按照您描述的方式失败。
如果连接通常快速完成,则可能不会有问题。
解决方案是将打开的连接数限制到同一域,以防止发生这种情况。
karlos发布的答案之所以有效,是因为连接的同步性阻止了其他人被打开。
就像评论中提到的那样,我在托管服务上启用了DNSSEC(缓存中毒保护)。
禁用它可以解决此问题,即使这可能不是一个很好的解决方案。经过几周的搜索,就足够了。
我将赏金提供给可以解释它的人,或者可以提供更好解决方案的人。
在您的代码中,您的请求默认超时时间为60秒,但是您可以如下在代码中更改“请求超时”。
在您的NetworkItem
类更改超时中。
init(request:NSMutableURLRequest){
self.request = request
self.request.timeoutInterval = 120
super.init()
}
尝试以下连接代码。这将为您提供帮助。
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
所以,在2019年,我们遇到了类似的问题。当服务器上的“ KeepAliveTimeout”设置为小于30时,似乎出现问题。解决方法是将标题“连接”设置为“关闭”。