Delphi XE5 iOS TidHTTP.get获取旧版本的文件。也许缓存了

时间:2013-10-28 11:07:47

标签: ios delphi indy

在iOS上使用Delphi XE5。

我正在尝试使用以下内容从服务器获取一个简单的文本文件:

filename := DocumentDir + theFile.txt;
myFile := TFileStream.Create(filename, fmCreate);
aIDHTTP := TIdHTTP.Create(nil);    
aIdHTTP.Get('http://www.TheServer.dk/TheDir/theFile', myFile);

稍后填充ListView

sl := TStringList.Create;
sl.loadFromFile(filename, TEncoding.ANSI);
ListView1.clear;
for i := 0 to sl.count - 1 do
begin
  aItem := Listview1.add;
  aItem.text := sl[i];
end;

它实际上运行正常,但是当我更改服务器上文件的内容时,我在重新运行代码时会在listview中获取旧数据。

我是否需要在某处清除缓存,如果是这样的话......我该怎么做?

提前感谢您的帮助。 亲切的问候 Jens Fudge

1 个答案:

答案 0 :(得分:1)

TIdHTTP.GET内置了缓存。

如果TIdHTTP正在缓存,它将发送一个条件get(使用If-Modified-Since标头),如果服务器正在合作,它将从发送回来的HTTP 304响应服务器。如果是这种情况,通常情况下,您的Web服务器将能够检测到文件已更改,并且不会返回304,而是提供最新版本的文件。如果这是问题,而且很可能不是,那么它将指向您在服务器上解决的问题。

如果您在使用TIdHTTP.GET的客户端和服务器之间遇到缓存问题,则客户端可能会在到达Web之前通过缓存Web代理(您可能甚至不知道它)服务器。通常,ISP实施缓存Web代理以降低其带宽成本。

要通知缓存机制不响应缓存响应,您可以尝试包含Cache-Control: no-cache标头,或者为了向后兼容HTTP / 1.0,您可以指定Pragma: no-cache标头。如果这些都不适合你,你可能必须变得更加复杂。

正如whsrdaddy建议的那样,打败过热的网络缓存代理的一种方法是发送一个额外的参数,该参数在每个请求上发生变化,例如日期和时间(低至毫秒)或随机生成的值。这样,缓存Web代理会将请求转发到Web服务器,而不是仅仅因为URL更改而提供缓存结果。

POST请求没有相同的问题,因此每当向服务器发送数据(修改)时务必使用POST,并且在请求资源时仅使用GET(读取只)。