URLOpenBlockingStream给出相同的页面

时间:2012-06-17 21:03:22

标签: delphi webserver

我写了一个Delphi函数,从另一个应用程序中检索一个网页。

当我使用文件通过

存储信息时,这样可以正常工作
  

结果:= URLDownloadToFile(nil,PChar(XmlUrl),PChar(XmlFileName_),0,nil);

当我使用URLOpenBlocking-stream时,我得到了正确的信息,但是第二次向网络服务器发出请求时,虽然页面已经更改,但我得到旧页面。

有人知道可能是什么原因吗?

function MyDownloadToBlockingSteam( URL : String; Var bsXmlStr : AnsiString): LongInt;
var
  ppStream  : ActiveX.IStream;
  statstg   : TStatStg;
  dwRead    : Integer;
begin
  Result := 1;

  bsXmlStr := '';

  If (URLOpenBlockingStream(nil, PChar(URL), ppStream, 0, nil) = S_OK) then
  Begin
    // Resource protection
    try
      if (ppStream.Stat(statstg, STATFLAG_NONAME) = S_OK) then // Get the stat from the IStream interface
      begin
        if (statstg.cbSize > 0) then // Make sure size is greater than zero
        begin
          SetLength ( bsXMLStr, statstg.cbSize+1 );
          Result := ppStream.Read( @bsXMLStr[1], statstg.cbSize, @dwRead); // Read from the stream
        end;
      end;
    finally
      ppStream:=nil; // Release the IStream interface
    end;
  end;//If ..
end;

3 个答案:

答案 0 :(得分:3)

请考虑使用InternetOpenUrl()InternetReadFile()。需要一些额外的编码来手动完成URLOpenBlockingStream()内部为您执行的相同操作,但InternetOpenUrl()确实有一个dwFlags参数,该参数接受INTERNET_FLAG_RELOAD标记强制从URL下载最新数据。 URLOpenBlockingStream()没有该选项。

答案 1 :(得分:1)

您可以通过在网址末尾附加一个随机数来避免缓存。有关详细信息,请参阅this SO page

答案 2 :(得分:0)

您也可以使用URLDownloadToFile()URLOpenBlockingStream() 如果您先致电DeleteUrlCacheEntry()