LittleBen - Sa 01.09.12 14:10
Titel: WinInet InternetReadFile - Cache
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:
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..1023] of AnsiChar; n, BufferLen: Cardinal; begin hOpen:= InternetOpen(PChar(FDesc), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); hURL:= InternetOpenUrl(hOpen, PChar('http://' + FHost +'/'+ RemoteFile), nil, 0, 0, 0); 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
LittleBen - Sa 01.09.12 17:05
jaenicke hat folgendes geschrieben : |
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 :)
jaenicke hat folgendes geschrieben : |
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:
PHP-Quelltext
1: 2:
| header("Cache-Control: no-cache, must-revalidate"); header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); |
Aber solang das erste Funktioniert, bin ich auch zufrieden :)