请求未发送
Request not sent
当我从我的应用程序中使用 API 时,我遇到了一个奇怪的问题。有时,无缘无故,请求只是没有发送,并且在超时结束时失败并出现以下错误:
Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."
我尝试了很多 API,例如 NSURLConnection
委托,NSURLSession
和 NSURLConnection.sendSynchronousRequest
都没有成功。
这是我为突出问题而制作的示例项目。 ConnectionBugApp
重现步骤如下:
- 运行 Xcode 中的应用程序并停止调试,以便应用程序在您的 phone
上
- 打开应用,点击测试连接(成功,加载轮立即停止旋转)
- 转到其他应用程序,例如 facebook/twitter/network 游戏(有些有点重)并切换到飞行模式几次
- 返回我的应用程序并单击测试连接(加载轮永远不会停止)
一些可能有帮助的细节:
如果我使用我的服务器IP而不是我的域名,它会成功
问题仅在 LTE/4G 网络上出现
任何想法或解决方法将不胜感激!欢迎询问更多详情。
谢谢
编辑
自从我第一次发布描述以来,我已经对其进行了很多编辑(希望使其更清晰),如果某些答案或评论不再真正有意义,我深表歉意。
尝试以下代码 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(缓存中毒保护)。
禁用它,解决了问题,尽管这可能不是一个很好的解决方案。经过几周的搜索,这就足够了。
我会将悬赏奖励给可以解释它或提供更好解决方案的人。
当我从我的应用程序中使用 API 时,我遇到了一个奇怪的问题。有时,无缘无故,请求只是没有发送,并且在超时结束时失败并出现以下错误:
Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."
我尝试了很多 API,例如 NSURLConnection
委托,NSURLSession
和 NSURLConnection.sendSynchronousRequest
都没有成功。
这是我为突出问题而制作的示例项目。 ConnectionBugApp
重现步骤如下:
- 运行 Xcode 中的应用程序并停止调试,以便应用程序在您的 phone 上
- 打开应用,点击测试连接(成功,加载轮立即停止旋转)
- 转到其他应用程序,例如 facebook/twitter/network 游戏(有些有点重)并切换到飞行模式几次
- 返回我的应用程序并单击测试连接(加载轮永远不会停止)
一些可能有帮助的细节:
如果我使用我的服务器IP而不是我的域名,它会成功
问题仅在 LTE/4G 网络上出现
任何想法或解决方法将不胜感激!欢迎询问更多详情。
谢谢
编辑
自从我第一次发布描述以来,我已经对其进行了很多编辑(希望使其更清晰),如果某些答案或评论不再真正有意义,我深表歉意。
尝试以下代码 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(缓存中毒保护)。
禁用它,解决了问题,尽管这可能不是一个很好的解决方案。经过几周的搜索,这就足够了。
我会将悬赏奖励给可以解释它或提供更好解决方案的人。