使用IDHTTP,会时不时出现访问不到目标网址的事,而这时用其他浏览器却能正常访问,与useragent无关,因为几秒钟前还能访问。
这时,再多次访问,也不行,包括使用动态创建的IDHTTP,每用一次FREE掉或用一个静态的IDHTTP,每次DISCONNECT;必须将程序关闭,重运行,才能再次访问,请问这是怎么回事,有什么解决办法?

解决方案 »

  1.   

    对这个问题有一种解析,就是你要访问的服务器用了硬件防火墙, 就是访问你的url的时候,网址后面会多出一个随机字符串!你在你的浏览器上访问的时候会看到网址后面是比正常时多出一些字符串的,但不是每次都会多出!这看防火墙的设置!
    如果你用idhttp.get网址的时候,它正好没多出这些字符串,那么你就可以访问到,否则你就不会访问到!
    不知是不是这个原因!
      

  2.   

    并非如此,查看日志并无URL的不同,而且POST或GET都有上述问题。在我自己的服务器做过测试,也遇到这个问题,我的服务器网站没有变动URL。
      

  3.   

    调用 Disconnect 再重新连接
      

  4.   


    调用了的,甚至有个模块是动态创建的IDHTTP,每次GET后都FREE了IDHTTP的
      

  5.   

    代码如下:
    function HttpGet(idhttp:tidhttp;url,cookies:widestring;var html:string):boolean;
    begin
      result:=true;
      try
        idhttp.Disconnect;
      except
      end;
      idhttp.HandleRedirects:=true;
      idhttp.AllowCookies:=false;
      idhttp.HTTPOptions:=[hoForceEncodeParams];
      idhttp.OnStatus:=frm_work.HttpStatus;
      idhttp.OnWork:=frm_work.HttpWork;
      idhttp.OnWorkBegin:=frm_work.HttpWorkBegin;
      idhttp.OnDisconnected:=frm_work.HttpDisconnected;
      idhttp.Port:=80;
      idhttp.ReadTimeout:=1000*c_timeout;  idhttp.Request.UserAgent:=DataBase.userAgent;
      idhttp.Request.Referer:=url;
      idhttp.Request.CustomHeaders.Clear;
      idhttp.Request.CustomHeaders.Append(cookies);  httpproxyinit(idhttp);
      try    if stopaction(orderstop) then
          begin
            result:=false;
            exit;
          end;    
        timeoutstart;
        try
          html:=idhttp.get(EnURLstr(url));
        except
          html:='';
          result:=false;
        end;
      finally     
        idhttp.Disconnect;
        timeoutend;
      end;
      
    end;
      

  6.   

    Indy在设计上有问题,遇到过这样的问题,俺的解决办法是动态创建IdHttp
      

  7.   

    我在用INDY的时候也遇到这种问题,然后SyncSocket了,这个非常好用,而且很稳定,但是对HTTP协议没有像INDY封装的那么好,需要自己修改一下。
      

  8.   

    XZHIFEI,你用动态创建解决了?我也是用动态创建的,还是不行,不过我用的是Tidhttp.Create(self),不是知道是不是该用Tidhttp.Create(nil),因为这个问题是不是每次都出现的,所以还没测试出用Tidhttp.Create(nil)能不能解决。我是在一个BUTTON的ONCLICK事件里动态创建的IDHTTP
      

  9.   

    应该是没有释放问题,
    动态创建的时候指定为Create(nil),然后自己释放
      

  10.   


    从你的代码看你没有释放 http,我一直都用先创建再释放的方法,没有问题。注意:释放的不是连接,而是对象。试试改成下面的吧:
    idHttp := TIdHTTP.Create;
    .... 
    你的代码
    ...
    idHttp.Free;
      

  11.   

    上面的例子是用的一个函数调用,在调用这个函数之后,是释放了的。idHttp := TIdHTTP.Create(self); 
    .... 
    HttpGet(idhttp,url,cookies,html);
    ... 
    idHttp.Free;