NSURLSession 通过 httpproxy 和 /etc/hosts 时出现 -1001 错误

Posted

技术标签:

【中文标题】NSURLSession 通过 httpproxy 和 /etc/hosts 时出现 -1001 错误【英文标题】:-1001 error when NSURLSession via httpproxy and /etc/hosts 【发布时间】:2014-08-13 05:19:09 【问题描述】:

我正在尝试在我的计算机中设置一个 http 代理服务器来模拟虚拟开发环境。

为了访问本地 url,我将 DNS 信息放入计算机的/etc/hosts

这是我的测试代码:

NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://someurl.local/bluh/bluh/path"];
NSURLSessionDataTask *dataTask =
  [session dataTaskWithURL:url
         completionHandler:^(NSData *data, NSURLResponse *response,
                             NSError *error) 
             NSLog(@"data is %@ error is %@", data, error);
         ];
[dataTask resume];

我的实验: 1. safari 或 chrome 等浏览器既可以访问本地 Web 服务,也可以访问远程 Web 服务。 2. NSURLSession 在访问本地 url 时会返回一个NSURLErrorDomain Code=-1001 "The request timed out."。 3. 如果 url 不在/etc/hosts 中,NSURLSession 可以正常工作。

我还尝试了NSURLConnection,与NSURLSession 的输出相同。 那么,这是否意味着NSURLConnection/NSURLSession和浏览器使用不同的策略来做DNS?

如何处理或绕过这个?

更新

我为 ios 7.0+ 构建了这个环境。

环境:

计算机系统:OS X 10.9.4 (13E28),其中设置了代理并有服务器。 设备系统:iOS 7.1.2(11D257)

【问题讨论】:

您可能希望更清楚地说明您在何处运行此代码。这是为 OS X 构建的吗?你在你的 iPhone 上运行它吗? (上面的代码可以编译为...)我们可以看到您的主机条目吗?您是否尝试过使用不同的域名? .local 对 OS X 有特定的含义,我相信。我使用<whatever>.localhost,这种东西对我来说很好。 @MattGibson 在将.local 替换为.localhost 后解决了这个问题。那你介意正式回答一下吗? 真的很幸运没有屏蔽***域... 完成。是的,如果没有真正的 TLD,那将更加困难。 【参考方案1】:

.local 在 OS X 上被视为一个特殊的 TLD,我认为是 iOS。我相信这主要是因为它使用了as an indicator for Bonjour lookups。尝试为您的开发域更改为不同的 TLD。我使用“.localhost”;我见过其他人使用“.dev”。这两个都按预期工作。

从链接的文章中可以看出,您可能遇到了这个问题,具体是因为您使用的是 x.local——一个单一标签,将通过 Bonjour 而不是 DNS 进行查找,因此您可能还会发现 @ 987654324@ 也可以使用,但我个人会尽量避免使用.local

【讨论】:

我们的情况完全相同:运行在本地 Mac 上的服务器可以通过其foo.local 地址访问同一网络上的相邻 Mac 和同一网络上的 Mobile Safari。但是尝试从手机上运行的NSURLSession 连接到foo.local 会导致超时。这个答案并没有告诉我太多——为什么它不起作用?由 Bonjour 或 DNS 进行查找的事实对NSURLSession 应该是透明的,不是吗?

以上是关于NSURLSession 通过 httpproxy 和 /etc/hosts 时出现 -1001 错误的主要内容,如果未能解决你的问题,请参考以下文章

通过 NSURLSession / NSURLSessionDownloadTask 下载完成时发送本地通知

NSURLSession 后台下载 - 通过网络故障恢复

通过 React Native 使用 must-revalidate 和 NSURLSession

使用NSURLSession同步获取数据(通过添加信号量)

如何通过 AFNetworking 和 NSUrlSession 调用 SOAP Web 服务

我想通过 Swift 实现 `curl --header $1`。(NSURLSession 的标头)