Autor Beitrag
LittleBen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Sa 01.09.12 14:10 
Guten Tag,
habe mal wieder ein Problem mit WinInet...mit meiner Funktion GetData (siehe unten) rufe ich einen PHP-Skript auf, der prüft, ob bestimmte Dateien auf dem Server vorhanden sind. Angenommen es wird geprüft ob die Datei Test.dat vorhanden ist, dann resultiert der Skript z.B. "'Test.dat' exists", wenn nicht, dann einen leeren String.
Wenn ich nun die Fkt. aufrufe und die Datei existiert, dann bekomme ich richtigerweise den Text "'Test.dat' exists" zurück. Sobald ich aber die Datei löschen und nochmal den Skipt mit der Fkt. aufrufe, bekomme ich immer noch den Text zurück, der sagt dass, sie existiert. Wenn ich parallel dazu den Skipt im FF ausführe, bekomme ich das richtige ergebnis zurück (leerer String).
Es dauert dann ca. 7 Aufrufe der Fkt. GetData, bis ich ein richtiges Ergebnis bekomme. Ich vermute stark, dass einfach noch das alte Ergebnis im Cache liegt...Bis jetzt habe ich einfach versucht, den Cache nach dem Öffnen zu löschen: InternetSetOption(hOpen,INTERNET_OPTION_RESET_URLCACHE_SESSION,0,0); Hat aber nichts gebracht.
Hier mein gesamter Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function THTTPUploader.GetData(RemoteFile: string): string;
var hOpen, hURL: HINTERNET;
    Buffer: array[0..1023of AnsiChar;
    n, BufferLen: Cardinal;
begin
 hOpen:= InternetOpen(PChar(FDesc), INTERNET_OPEN_TYPE_PRECONFIG, nilnil0);
 hURL:= InternetOpenUrl(hOpen, PChar('http://' + FHost +'/'+ RemoteFile), nil000);
 try
  if Assigned(hURL) then
  begin
   repeat
    InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
    if BufferLen = SizeOf(Buffer) then
     result:= result + AnsiString(Buffer)
    else
     if BufferLen > 0 then
      for n:= 0 to BufferLen - 1 do
      result:= result + Buffer[n];
   until BufferLen = 0;
  end;
 finally
  InternetSetOption(hOpen,INTERNET_OPTION_RESET_URLCACHE_SESSION,0,0);
  InternetCloseHandle(hURL);
  InternetCloseHandle(hOpen);
 end;
end;

Habt ihr irgendwelche Ideen, wie ich den Cache gelöscht bekomme?

Viele Grüße,
Littleben
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 01.09.12 16:15 
Lösche nicht den Cache, sondern rufe entweder das Skript mit einem Zufallswert als Parameter ab (so "weiß" die Funktion nicht, dass es die selbe Datei ist) und/oder gib im Header aus dem PHP-Skript heraus an, dass kein Cache benutzt werden soll (Cache-Control auf no-cache bzw. Expires auf ein Datum in der Vergangenheit, ...).
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Sa 01.09.12 17:05 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Lösche nicht den Cache, sondern rufe entweder das Skript mit einem Zufallswert als Parameter ab (so "weiß" die Funktion nicht, dass es die selbe Datei ist)
Das funktionert wunderbar, danke :)

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
gib im Header aus dem PHP-Skript heraus an, dass kein Cache benutzt werden soll (Cache-Control auf no-cache bzw. Expires auf ein Datum in der Vergangenheit, ...).
Das widerum funktioniert nicht...hab am Anfang der PHP-Datei das hinzugefügt:
ausblenden PHP-Quelltext
1:
2:
  header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit
Aber solang das erste Funktioniert, bin ich auch zufrieden :)