繁体   English   中英

Delphi XE5 iOS TidHTTP.get获取旧版本的文件。 可能已缓存

[英]Delphi XE5 iOS TidHTTP.get gets old version of file. Cached perhaps

在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;

它实际上工作正常,但是当我更改服务器上文件的内容时,重新运行代码时,我在列表视图中获得了旧数据。

如果需要,我是否需要清除缓存的地方。我该怎么办?

在此先感谢您的帮助。 亲切的问候詹斯·福吉

TIdHTTP.GET没有内置缓存。

如果TIdHTTP正在缓存,它将发送条件获取(使用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代理会将请求转发到Web服务器,而不是仅仅因为URL更改就提供了缓存结果。

POST请求不会有相同的问题,因此请确保在将数据发送到服务器时(修改)使用POST ,并且仅在请求资源时使用GET (只读)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM