Arhn - архитектура программирования

Delphi XE5 iOS TidHTTP.get получает старую версию файла. Кэш возможно

Использование Delphi XE5 на iOS.

Я пытаюсь получить простой текстовый файл с сервера, используя следующее:

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;

На самом деле это работает нормально, но когда я меняю содержимое файла на сервере, я получаю старые данные в своем списке при повторном запуске кода.

Нужно ли где-то очищать кеш, если да.. Как мне это сделать?

Заранее благодарю за любую помощь. С уважением Йенс Фадж

28.10.2013

  • добавьте случайный параметр, связанный со временем, к вашему URL-адресу. например: TheServer.dk/TheDir/theFile?q=12345 28.10.2013
  • Спасибо, кто. Это сработало как шарм. Можете ли вы превратить свой комментарий в ответ, чтобы я мог отдать вам должное? 29.10.2013
  • Йенс, вы можете принять ответ Маркуса Адамса, он указывает на все детали. Плевать на представителя... 29.10.2013

Ответы:


1

В TIdHTTP.GET нет встроенного кэширования.

Если бы TIdHTTP выполнял кеширование, он отправил бы условный запрос get (используя заголовок If-Modified-Since), а если бы сервер сотрудничал, он отправил бы ответ HTTP 304 с сервера. Если бы это было так, обычно ваш веб-сервер мог бы обнаружить, что файл был изменен, и не возвращал бы 304, а вместо этого обслуживал бы самую последнюю версию файла. Если бы это было проблемой, а это, скорее всего, не так, это указывало бы на проблему, которую вы решили бы на сервере.

Если вы столкнулись с проблемой кэширования между клиентом и сервером с помощью TIdHTTP.GET, возможно, что клиент проходит через кэширующий веб-прокси (и вы можете даже не знать об этом), прежде чем он достигнет веб-сервера. Часто интернет-провайдеры внедряют кэширующие веб-прокси, чтобы снизить затраты на пропускную способность.

Чтобы сигнализировать механизмам кэширования, чтобы они не отвечали кэшированным ответом, вы можете попробовать включить заголовок Cache-Control: no-cache или для обратной совместимости с HTTP/1.0 вы можете указать заголовок Pragma: no-cache. Если ни один из них не работает для вас, возможно, вам придется стать более изощренным.

Как предположил whsrdaddy, один из способов победить чрезмерно усердный веб-кэширующий прокси — отправить дополнительный параметр, который меняется при каждом запросе, например дату и время (с точностью до миллисекунды) или случайно сгенерированное значение. Таким образом, кэширующий веб-прокси будет перенаправлять запрос на веб-сервер, а не обслуживать кешированный результат просто потому, что URL-адрес изменился.

Запросы POST не имеют такой же проблемы, поэтому обязательно используйте POST при отправке данных на сервер (модификации) и используйте только GET при запросе ресурсов (только чтение).

28.10.2013
  • Вы также можете попробовать установить TIdHTTP.Request.Pragma := 'no-cache'; перед вызовом TIdHTTP.Get(). 29.10.2013
  • Это тоже может сработать, но теперь я просто вставил строковое представление now(); на ходу.. работает отлично. Но все равно большое спасибо 29.10.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..