zoukankan      html  css  js  c++  java
  • ASIHttpRequest的一个bug和30s超时

    做项目的时候遇到这样一个问题:

    流程是这样的:用户填写好订单后,提交订单。提交订单后,在另一个页面,可以查看已经提交的订单(一个列表,列表中显示提交过的订单号)。遇到的问题是,提交一个订单后,在订单查看页面,有时候能够看到两个订单,通过后台测试,后台收到了两个提交订单的请求,故而产生了两个订单。查询资料后得知,是由于ASIHttpRequest的一个bug导致的,使用如下方法解决:

    以下内容转载自:http://blog.csdn.net/kmyhy/article/details/6963925

    今天在项目中发现一个ASIHttpRequest的Bug。这个Bug可能会导致你Http请求延时至少在timeout设置时间结束之后。更可怕的是,为了找出这个Bug,可能会浪费程序员更多的时间。为这个问题我至少奋斗了3个小时!

    项目中一直在使用ASIHttpRequest,但有一次,我发现Http请求居然总是不成功。我下意识地以为这是网络延时问题,我延长了ASIHttpRequest的超时时间至30秒,于是程序不再报错。

    但今天在使用同样的代码时,我发现以前我全错了。这不是超时的问题,而是ASIHttpRequest的一个Bug。

    因为这次我请求本机的Tomcat服务器的某个jsp页面,页面代码写得很简单,在firefox中请求该页面的响应时间不会超过0.01秒,但在iPhone模拟器中居然用了20多秒才返回。这不可能是网络延时的原因。

    当我把超时时间改小至10秒,等待超时时间结束,ASIHttpRequest甚至直接报kCFStreamEventErrorOccurred错误。

    我打开ASIHttpRequest的所有调试日志,发现ASIHttpRequest似乎在尝试用上次的连接去连接服务器:

    Request #3 will use connection #2

    Request attempted to use connection #2, but it has been closed -will retry with a new connection

    Request #3 will use connection #3

    它好像连接时重用上次的http连接。这样肯定是不行的,因为上次的http请求结束后服务器已经把连接关闭了。

    于是我们只能把ASIHttpRequest的连接重用关闭:

    [request setShouldAttemptPersistentConnection:NO];

    这样,前面的问题就不会出现了。其实,在不同的http会话中,不应该开启PersistentConnection。

  • 相关阅读:
    几种参数传递问题(读c++ primer plus)
    开源技术知识
    指针、引用与句柄(综合别人博客,方便大家和自己学习)
    转OpenGLhttp://www.zwqxin.com/archives/opengl.html
    我电脑上安装的软件(XP系统,GIS专业)
    回忆照片
    Richfaces为何那么“慢”?
    Windows和Linux下Java程序开发入门
    MiniOA项目介绍及源代码下载(Java JSF B/S)
    年会抽奖程序代码讲解(c#版)
  • 原文地址:https://www.cnblogs.com/benbenzhu/p/3076234.html
Copyright © 2011-2022 走看看