【问题标题】:No request information sent with ASIHTTPRequest没有使用 ASIHTTPRequest 发送请求信息
【发布时间】:2012-06-02 07:45:04
【问题描述】:

我在使用 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 的一个子类,它包含字符串标签的属性、漂亮的描述和其他供消费对象使用的东西,并且不会覆盖任何 ASI 内容。

任何人都可以解释为什么/如何 ASI 可以打开连接,然后在几分钟内完全不发送任何内容吗?

编辑:只是为了澄清。连接确实与服务器联系,它只是从不通过我的服务器日志可以告诉的连接发送任何数据。这似乎总是发生在应用程序唤醒并影响所有连接,包括 MapKit 产生的 NSURLConnections。整个应用程序似乎失去了它的弹珠。 我还看到一堆后台任务在此之前就结束了,但是在调试器中我永远无法捕捉到它们。

【问题讨论】:

  • 以上是构造方法创建请求的代码。在这一切之后,我确实调用了 startAsynchronous,并且每次都会调用它。
  • 新信息:在这些空请求的一集之前,我在系统日志中的应用程序唤醒中看到以下一系列内容:“:无法结束背景任务:不存在标识符为 17 的后台任务,或者它可能已经结束了。”我没有开始后台任务,所以我认为这是出现问题的症状。这些后台执行请求会不会是 ASI?
  • 您仍然需要发布代码如何调用 startAsynchronous

标签: iphone ios networking timeout asihttprequest


【解决方案1】:

您似乎不是根据您提供的代码开始您的请求。设置完各种属性后,尝试调用 OTSHTTPRequest 对象的 -[startSynchronous] 或 -[startAsynchronous] 方法。

【讨论】:

  • 我忘了说这是构造方法创建请求的代码。在这一切之后,我确实调用了 startAsynchronous。我会在我的原件上添加一个注释。
【解决方案2】:

你是在设置委托,要么我忽略了它,要么你把它去掉了。

【讨论】:

  • 我在发送请求之前设置委托。并且委托被要求超时并且所有工作都按预期进行。 (至于对错误做正确的事)
【解决方案3】:

直到几天过去了,我才想说什么。在这种情况下,解决方案非常模糊。

看来我使用的 TestFlight 版本中存在可能导致此问题的错误。自从它被移除以来,我没有遇到过这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2016-03-22
    • 2021-05-03
    相关资源
    最近更新 更多