Как заставить Microsoft XmlHttpRequest соблюдать директиву управления кешем

Можно хотеть изучить svnadmin инструмент.

, Чтобы быть честным я не попробовал это прежде, и Вы, вероятно, получите ответ от кого-то, кто имеет, но можно работать от чего-то вроде этого:

необходимо быть в состоянии к init новый репозиторий, создать 'магистральный' каталог в нем, затем вывести предыдущий репозиторий в 'соединительную линию'.

30
задан Ian Boyd 27 October 2017 в 17:46
поделиться

8 ответов

К сожалению, объект XMLHttpRequest был спроектирован таким образом, потому что он основан на WinInet. Кроме того, не рекомендуется использовать со стороны сервера. Вы должны использовать ServerXMLHttpRequest , который имеет те же функции, но зависит от WinHTTP . См. FAQ для получения дополнительной информации. Описание из документации ServerXMLHttp гласит:

Стек HTTP-клиента предлагает более длительное время безотказной работы. Функции WinInet, которые не являются критичными для серверных приложений, такие как кэширование URL-адресов, автоматическое обнаружение прокси-серверов, разбиение на части HTTP / 1.1, автономная поддержка и поддержка протоколов Gopher и FTP, не включены в новое подмножество HTTP.

Это означает, что вместо использования XmlHttpRequest :

IXMLHTTPRequest http = CreateComObject("Msxml2.XMLHTTP.6.0");     http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();

можно использовать ServerXmlHttpRequest :

IXMLHTTPRequest http = CreateComObject("Msxml2.ServerXMLHTTP");
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();

или WinHttpRequest :

IWinHttpRequest http = CreateComObject("WinHttp.WinHttpRequest.5.1");
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();
17
ответ дан 28 November 2019 в 00:24
поделиться

Я обнаружил, что с помощью заголовка If-None-Match указание значения, которое не соответствует ETag последнего запроса, будет работать.

Например:

req.open("GET", url, false);
req.setRequestHeader("If-None-Match", "\"doesnt-match-anything\"");
req.send();

Это может потребовать или не потребовать, чтобы ответы включали ETag. (Я пробовал это только с сервисом, который включает значение ETag в каждом ответе.)

5
ответ дан 28 November 2019 в 00:24
поделиться

Не могли бы вы добавить фиктивный параметр в конце вашего URI, который меняется с каждым запросом?

http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml?requestID=42", False, "", "");
1
ответ дан 28 November 2019 в 00:24
поделиться

Я использую это для поддержания активности, и это прекрасно работает.
Хитрость заключается в том, чтобы использовать заголовок «If-Modified-Since» со значением более новым, чем кэшированное браузером.

g_AjaxObj.onreadystatechange = function() { if(g_AjaxObj.readyState === 4) { AjaxOnComplete_("KeepAlive"); }};
g_AjaxObj.open('GET', URL, true);
g_AjaxObj.setRequestHeader("If-Modified-Since", new Date().toUTCString());
g_AjaxObj.send(null);
1
ответ дан 28 November 2019 в 00:24
поделиться

Попробуйте отправить «cache-control: private» в качестве заголовка. Это сработало для меня:

var request = new XMLHttpRequest();
request.open("GET", 'http://myurl.com' , false); 

request.setRequestHeader("cache-control", "private");

Я пишу HTML & amp; Приложение Javascript для Windows 8, где и без кеша, и с максимальным возрастом игнорируются. Для меня вышесказанное работает просто отлично.

Я не был знаком с заголовком, поэтому немного покопался в управлении кэшем: private ...

Indicates that all or part of the response message is intended for a single user and MUST NOT be cached by a shared cache, such as a proxy server.

Из Что такое Cache-Control: private? и http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Таким образом, в принципе, это никогда не создаст запись в кеше и, следовательно, не добавит записи в кеш, которые, как мы знаем, являются излишними, как в случае с параметром случайного числа «cache-buster».

0
ответ дан 28 November 2019 в 00:24
поделиться

Этот заголовок предназначен для сервера, и, поскольку браузер не выполняет никаких запросов, он бесполезен.

Простой трюк - загрузить страницу следующим образом:

http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml?"+Math.random(), False, "", "");
0
ответ дан 28 November 2019 в 00:24
поделиться

Недостатком является то, что вы заполняете кеш несколькими копиями одного и того же контента. Это может быть хаком с ошибочными агентами http - но реальное решение - работать с механизмами кэширования, а не против них. -

Я согласен, что это не идеальное и не совсем решение, но Mozilla на самом деле рекомендует это в качестве обходного пути, поэтому я считаю, что это не должно быть слишком ужасно - https: // developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest

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

0
ответ дан 28 November 2019 в 00:24
поделиться

Это сводило меня с ума. Эта тема была ближе всего к ответу. К сожалению, во время тестирования никто из них на самом деле не работал для меня. Единственное решение, которое я нашел и которое протестировало для правильной работы, это установка:

Заголовок Pragma: no-cache

Надеюсь, это спасет других от головной боли IE.

Кстати, это поток StackOverflow отлично подходит для того, чтобы пролить свет на разницу между Pragma и Cache-control: Разница между Pragma и Cache-control заголовками?

0
ответ дан 28 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: