10

我已经开始在我的 iOS 项目中使用 ASIHTTPRequest 来执行 REST 服务器方法调用,并且到目前为止非常成功。我只有一个奇怪的间歇性问题。偶尔我会从使用 [ASIHTTPRequest startAsynchronous] 得到以下响应:

HTTP/0.9 200 正常

发生这种情况时,我的服务器方法不会被调用。通常每个方法调用都会返回一个以“HTTP/1.1”开头的响应。我正在使用带有 GeoTrust/RapidSSL 证书的 HTTPS 来保护连接。有趣的是,我发现如果我尝试连接到 SSL 端口(443)但指定“http”作为协议,我会得到相同的“HTTP/0.9 200 OK”响应。

只是为了添加更多信息 - 问题主要发生在应用程序闲置一段时间后。例如,请求成功完成,然后让应用程序空闲一段时间,然后在下一个请求时出现问题,然后应用程序继续正常工作。

任何人都可以阐明可能发生的事情吗?

非常感谢,乔纳森

更新:当问题发生时,我已经粘贴了 ASIHTTPRequest 输出的一些调试信息:

2012-07-12 09:35:49.376 mytestapp[3038:18f07] [CONNECTION] Closing connection #13 because it has expired
2012-07-12 09:35:49.377 mytestapp[3038:18f07] [CONNECTION] Closing connection #14 because it has expired
2012-07-12 09:35:49.378 mytestapp[3038:18f07] [CONNECTION] Closing connection #15 because it has expired
2012-07-12 09:35:49.380 mytestapp[3038:18f07] [CONNECTION] Request #39 will use connection #16
2012-07-12 09:35:49.381 mytestapp[3038:18f07] [CONNECTION] Request #40 will use connection #17
2012-07-12 09:35:49.382 mytestapp[3038:18f07] [CONNECTION] Request #41 will use connection #18
2012-07-12 09:35:49.529 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a1e00> finished downloading data (0 bytes)
2012-07-12 09:35:49.529 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a1e00> received response headers
2012-07-12 09:35:49.530 mytestapp[3038:18f07] [AUTH] Request <ASIHTTPRequest: 0x88a1e00> has passed Basic authentication
2012-07-12 09:35:49.530 mytestapp[3038:18f07] [CONNECTION] Got no keep-alive header, will keep this connection open for 60.000000 seconds
2012-07-12 09:35:49.530 mytestapp[3038:18f07] [CONNECTION] Request #41 finished using connection #18
2012-07-12 09:35:49.531 mytestapp[3038:18f07] [STATUS] Request finished: <ASIHTTPRequest: 0x88a1e00>
2012-07-12 09:35:49.531 mytestapp[3038:15803] responseHeaders={
}
2012-07-12 09:35:49.531 mytestapp[3038:18f07] [STATUS] Request cancelled: <ASIHTTPRequest: 0x88a1e00>
2012-07-12 09:35:49.532 mytestapp[3038:18f07] [STATUS] Request cancelled: <ASIHTTPRequest: 0x88a0200>
2012-07-12 09:35:49.532 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a0200>: Cancelled
2012-07-12 09:35:49.532 mytestapp[3038:18f07] [CONNECTION] Request #39 failed and will invalidate connection #16
2012-07-12 09:35:49.533 mytestapp[3038:18f07] [STATUS] Request cancelled: <ASIHTTPRequest: 0x88a0a00>
2012-07-12 09:35:49.533 mytestapp[3038:18f07] [STATUS] Request <ASIHTTPRequest: 0x88a0a00>: Cancelled
2012-07-12 09:35:49.533 mytestapp[3038:18f07] [CONNECTION] Request #40 failed and will invalidate connection #17
4

3 回答 3

2

在这种情况下不确定 IOS 细节,但 HTTP 0.9 已完全放弃。这有明确的原因 - 它不支持“Host:”标头。这意味着单个 IP 根本无法拥有虚拟主机。这些东西在 90-s 结束时变得过时了。

这种反应在现实生活中不应该发生。如果仍然发生,则某些客户端发出了诸如“GET / HTTP/0.9”之类的请求。但是这些客户在大约 15 年前就消失了。

SSL 是 HTTP 不太了解的东西。所以我相信这不相关。设置 SSL 隧道,然后运行纯 HTTP。

作为结论,我会说您或某人可能触发了过时的方法。而IOS可能只是不知道如何处理它。也许 IOS 方法是包含主机名的有限方法,因此它不会触发。无论如何,如果客户真的在说 0.9,你不应该担心它,因为它无论如何都没有从大多数网站得到正确的答案。如果客户端说 1.1 而你回答 0.9,那么可能会以某种方式误解请求,并且会出现回退机制到最低的 HTTP 版本。也许您忘记为请求设置主机名或在其中出现语法错误?

于 2012-06-12T01:50:51.397 回答
1

在网络上有一些关于这个问题的提及,基本上它与持久连接有关,当 Content-length 标头和一些错误服务器返回的内容本身出现问题时。它可能会搞砸浏览器和 iOS 框架,而且他们实际上并没有注意到标题。

这是可能的解释之一

尝试禁用持久连接,它应该会有所帮助。这个建议来自 ASIHTTPRequest 的开发人员(情况非常相似)。

[httpRequest setShouldAttemptPersistentConnection:NO]; 
于 2012-07-15T12:34:40.143 回答
1

HTTP/0.9 200 OK是一个不存在的消息头。HTTP/0.9 被定义为 request: GET <Request-URI> HTTP/0.9 <CRLF>,对其的响应是[Entity-Body],没有任何状态行或标头。(<urn:ietf:rfc:1945>)

你的软件某处有错误。我猜该请求要么失败,要么尚未收到。

于 2013-05-23T22:02:32.960 回答