我在使用 ASIHTTPRequest 的 iOS 4.3+ 上遇到问题,其中触发了请求但没有数据(请求方法、url、标头等)到达服务器。连接超时,因为它永远不会收到回复。
服务器听到空请求(经过一段时间的延迟),然后听到一个有效的请求,当然这个请求永远不会报告给更高级别的代码,因为连接已经超时。这有点奇怪,因为请求未配置为重新发送数据。
这通常发生在应用程序被推到后台一段时间(15 分钟或更长时间)并且允许手机进入睡眠状态之后。
我的请求配置如下:
NSMutableData *postData = nil;
NSString *urlString = [NSString stringWithFormat:@"%@%@",[self baseURL],requestPath];
OTSHTTPRequest *request = [OTSHTTPRequest requestWithURL:[NSURL URLWithString:urlString]];
[request setCachePolicy:ASIFallbackToCacheIfLoadFailsCachePolicy];
[request setTimeOutSeconds:45];
//Set up body
NSString *queryString = [self _RPcreateQueryString:query];
if ([queryString length]>0) {
if(method == RPAsyncServerMethodPost || method == RPAsyncServerMethodPut){
postData = [[[queryString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES] mutableCopy] autorelease];
}else{
NSURL *url = [NSURL URLWithString:[urlString stringByAppendingFormat:@"?%@",queryString]];
[request setURL:url];
if (!url) return nil; //url String malformed.
}
}
// ... ///
// method setting stripped for brevity
[request addRequestHeader:@"Content-Type" value:@"application/x-www-form-urlencoded"];
if(headers){
for (NSString* head in headers) {
if ([[headers valueForKey:head] isKindOfClass:[NSString class]])
[request addRequestHeader:head value:[headers valueForKey:head]];
}
}
[request addRequestHeader:@"Content-Length" value:postLength];
[request setPostBody:postData];
OTSHTTPRequest 只是 ASIHTTPRequest 的一个子类,它包含字符串标签的属性、漂亮的描述和其他供消费对象使用的 bling,并且不会覆盖任何 ASI 内容。
任何人都可以解释为什么/如何 ASI 可以打开连接,然后在几分钟内完全没有发送任何内容吗?
编辑:只是为了澄清。连接确实与服务器联系,它只是从不通过我的服务器日志可以告诉的连接发送任何数据。这似乎总是发生在应用程序唤醒并影响所有连接,包括 MapKit 产生的 NSURLConnections。整个应用程序似乎失去了它的弹珠。我还看到一堆后台任务在此之前就结束了,但是在调试器中我永远无法捕捉到它们。