iOS中的Sudz-C - 在3G/edge连接下无法工作,但在wifi下可以工作。

3

我使用iOS 5.0.1和iPhone 4s(也测试过4),使用Sudz-c生成的代码来连接我们的Web服务。该服务在WiFi上运行良好,但如果我尝试使用3g或EDGE连接,则无法正常工作。我收到以下错误信息: 即使在3g / edge上,它也从Safari加载url。

2012-01-15 18:32:13.987 SudzCExamples[487:707] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x18af60 {NSErrorFailingURLStringKey=http://sensored/app/soap/sensored/, NSErrorFailingURLKey=http://sensored/app/soap/sensored/, NSLocalizedDescription=The request timed out., NSUnderlyingError=0x18afa0 "The request timed out."}
2012-01-15 18:32:13.988 SudzCExamples[487:707] Error: The request timed out.

SoapRequest中的url请求已收到响应。
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 有什么建议吗?
更新:如果我使用相同代码的其他服务器,它在3g上也可以很好地工作。看起来问题出在我们的服务器端代码上。有什么想法是什么原因?
更新2: 电话1:该应用程序仅通过wifi工作。(运营商:Sonera) 电话2:该应用程序仅通过wifi工作。(运营商:Sonera) 电话3:该应用程序仅通过wifi工作。(运营商:Sonera) 电话4:该应用程序在3g和wifi上都很好。(运营商:Elisa) iPad:该应用程序在3g和wifi上都很好。(运营商:Elisa)
如果我使用我们的服务与手机4一起使用,它也可以在3g上很好地工作。如果我将手机4的互联网连接共享给iPhone1(或2或3),则它将在该共享的wifi上工作,但不会在其自己的3g上工作。如果我将电话1(或2或3)连接共享到电话4,则它不会在电话4上的该共享wifi上工作。
我能注意到这些电话之间唯一的区别是电话1、2和3使用名为TeliaSonera的芬兰互联网服务提供商,而电话4使用Elisa。
更新3:我在iPhone模拟器中运行应用程序,它可以很好地工作。启动Charles代理后,它不再工作。请求成功发送到服务器,并实际上也给出了响应,即使应用程序失败。 以下是Charles Proxy软件显示的请求和响应:
POST /app/soap/sensored/ HTTP/1.1
Host: sensored
User-Agent: Sensored/1.0 CFNetwork/548.0.3 Darwin/11.2.0
Content-Length: 396
Accept: */*
SOAPAction: urn:sensoredSoapModelAction
Content-Type: text/xml; charset=utf-8
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=a60ef32d72121d625a95b75b90d48a22
Connection: keep-alive

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:sensored"><soap:Body><checkUpdates><authHash>daswwe12e2e2wweqwessd</authHash><lastCheckDate>2012-01-19 05:45</lastCheckDate></checkUpdates></soap:Body></soap:Envelope>

响应

HTTP/1.1 200 OK
Date: Thu, 19 Jan 2012 05:45:34 GMT
Server: Apache
X-Powered-By: PHP/5.3.2-1ubuntu4.11
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 537
Keep-Alive: timeout=5
Connection: Keep-Alive
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:sensored" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:checkUpdatesResponse><checkUpdatesReturn xsi:type="xsd:string">[dds2d,asddd2,a0333f,20dks]</checkUpdatesReturn></ns1:checkUpdatesResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

概述

URL http://sensored/app/soap/sensored/
Status Complete
Response code 200 OK
Protocol HTTP/1.1
Method POST
Content-type text/xml; charset=utf-8
Client address /127.0.0.1
Remote Address sensored/177.33.83.129

Request Start time 19.1.2012 7:45:27
Request End time 19.1.2012 7:45:27
Response Start time 19.1.2012 7:45:28
Response End time 19.1.2012 7:45:33
Duration 5.77 sec
Request Duration 532 ms
Response Duration 4.99 sec
Latency 250 ms
Speed 0,24 KB/s
Response speed 0,13 KB/s

Request Header Size 366 bytes
Response Header Size 400 bytes
Request Size 396 bytes
Response Size 272 bytes
Total size 1,40 KB (1434 bytes)
Request Compression -
Response Compression 49,3% (gzip)

你能提供更多关于“我使用其他服务器”的信息吗?你是在使用运行相同服务器端代码的不同服务器吗?还是在访问另一个服务器上的不同服务?了解这些将有助于确定问题是否与网络连接/速度有关,或者是否与服务的代码和/或配置有关。 - Tim Dean
所以我的意思是我在不同的服务器上访问不同的服务。 - mikkokut
请再次检查我的更新 :) - mikkokut
根据您的更新,我已更新下面的回复。听起来TeliaSonera在路由请求到您的服务方面做了一些不同的事情,而这种差异由于某种原因未被您的服务处理。在此处使用服务器端日志访问将会很有帮助。 - Tim Dean
3个回答

1
我的iPhone在WiFi上无法加载Facebook(所有其他应用程序都正常工作,但Facebook在Safari网络浏览器中停止加载,在我妈妈的笔记本电脑上使用Modzilla时也是如此,但其他网站可以正常工作,但在我的3G连接上工作。经过几个小时的搜索,几乎摧毁了我的路由器(真的),我找到了一个解决方案:我手动更改了路由器使用的服务器,通过添加来自谷歌的DNS,一切都开始工作:)...暂时的:/感谢这位提供建议的人> http://tidbits.com/article/13259 我也从他那里得到了谷歌DNS。尝试一下,它可能也适用于您。也许我们所有人都因为路由器上的服务器而遇到麻烦。

1
“请求超时” - 这意味着正在加载大量数据,使得Edge或3G连接超时,因为它们不够快。Wifi更快,所以它能在服务器由于超时而取消请求之前加载整个数据。我建议您尝试使用/传输较少的数据,或将其分块加载,或异步加载(如果您的NSURLConnection尚未执行此操作)。

不,我认为这不是答案。事实上,有时候通过3G网络比我们的WiFi更快。我还可以通过WiFi共享其他iPhone的网络,并使用我的应用程序连接到该网络,它仍然可以正常工作。但如果我使用同一部iPhone的3G网络,它就无法工作。我使用的数据量非常小。 - mikkokut

1

您正在尝试连接的服务器主机是否可通过3G网络到达?当您连接WiFi网络时,您可能可以通过该网络访问任意数量的域。并非所有这些网络在通过3G网络连接时都是可见的。

如果该服务器可通过3G网络访问,则另一个可能性是您正在访问的服务可能存在限制,无论是故意还是意外地触发了这些限制。故意限制的例子可能是一个服务,它查看请求者的IP地址,并仅在请求来自内部网络客户端时响应。意外限制的例子可能是一个服务,它期望某个特定的标头,该标头由本地网络代理自动插入,但是当通过3G绕过该代理时,该标头永远不会被插入。

您是否有任何访问服务器端日志的权限,以提供更多指导?是否有控制服务配置的权限?听起来TeliaSonera的3G服务在其连接中做了一些不同的事情,这使得消息接收方式(或是否接收)与您的服务有所不同。


是的,我的同事和我一起完成了服务器端代码,我确信这段代码没有任何限制。我可以访问服务器端日志。无法成功连接的连接仍将显示在www-access日志中。我应该检查哪种类型的日志? - mikkokut
1
如果服务器日志显示连接已经建立,那么你需要进行一些服务器端调试,以查看是否由于某种原因未能响应。具体要查找什么取决于服务的类型、运行的SOAP服务器等。 - Tim Dean
是的,日志显示即使不正确工作,POST请求也将到达服务器。我对防火墙很确定,但我不知道为什么它们会阻止来自其他运营商的连接。 - mikkokut
我测试了Charles代理,详见更新3。 - mikkokut
问题解决了!Charles代理显示响应时间太长(超过5秒,而超时时间为5秒),因此应用程序由于某种原因不想接受响应。我的同事在服务器端代码中发现了一个gzip错误,因此处理速度现在快了五倍。有趣的是,连接花费的时间稍微多一点,就无法再使用其他运营商。但现在它可以工作了!感谢Tim Dean! - mikkokut
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接