Как я могу предотвратить кеширование IE от дублирования запросов Ajax? - PullRequest
4 голосов
/ 05 июня 2009

Мы используем тег динамического сценария с механизмом JsonP для выполнения междоменных вызовов Ajax. Внешний виджет очень прост. Он просто вызывает поисковый веб-сервис, передавая критерии поиска, предоставленные пользователем, и получая и динамически отображая результаты.

Примечание - Для тех, кто не знаком с меткой динамического сценария с JsonP для выполнения Ajax-подобных запросов к службе, возвращающей данные в формате Json, я могу объяснить, как использовать ее, если вы думаю, что это может иметь отношение к проблеме.

Служба WCF размещена на IIS. Это Restful, поэтому первое, что мы делаем, когда пользователь нажимает кнопку поиска, - это генерируем URL, содержащий критерии. Похоже на это ...

HTTPS: //.../service.svc критерии = джон + кузнец

Затем мы используем динамически созданный HTML-тег сценария с атрибутом источника, установленным на вышеуказанный URL-адрес, для отправки запроса в наш сервис. Результат возвращается, и мы обрабатываем его, чтобы показать результаты.

Все это прекрасно работает, но мы заметили, что при использовании IE служба получает запрос от клиента Дважды . Я использовал Fiddler для отслеживания трафика, покидающего браузер, и, конечно же, я вижу два запроса со следующими URL-адресами ...

Второй запрос был дополнен каким-то идентификатором. Этот идентификатор отличается для каждого запроса.

Я сразу подумал, что это как-то связано с кэшированием. Добавление случайного числа в конец URL-адреса является одним из классических подходов к отключению кэширования браузера. Чтобы доказать это, я изменил настройки кеша в IE.

  • Я установил для «Проверять наличие новых версий сохраненных страниц» значение «Никогда» - каждый раз выполнялся только один запрос. Один со случайным числом на конце.

  • Я установил для этого значения по умолчанию значение «Автоматически», и запросы сразу же начали отправляться дважды.

Интересно, что я не получаю оба запроса от клиента. Я нашел эту ссылку , где кто-то предполагает, что это может быть ошибкой в ​​IE. Тот факт, что это не происходит для меня в Firefox, подтверждает эту теорию.

  1. Кто-нибудь может подтвердить, если это ошибка в IE? Это может быть дизайн.
  2. Кто-нибудь знает, как я могу остановить это?

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

Ответы [ 3 ]

3 голосов
/ 05 июня 2009

Я только что написал статью о том, как избежать кэширования запросов ajax : -)

В основном это включает добавление заголовков без кэша к любому запросу ajax, который приходит

public abstract class MyWebApplication : HttpApplication
{
    protected MyWebApplication()
    {
        this.BeginRequest += new EventHandler(MyWebApplication_BeginRequest);
    }

    void MyWebApplication_BeginRequest(object sender, EventArgs e)
    {
        string requestedWith = this.Request.Headers["x-requested-with"];
        if (!string.IsNullOrEmpty(requestedWith) && requestedWith.Equals(”XMLHttpRequest”, StringComparison.InvariantCultureIgnoreCase))
        {
            this.Response.Expires = 0;
            this.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
            this.Response.AddHeader(”pragma”, “no-cache”);
            this.Response.AddHeader(”cache-control”, “private”);
            this.Response.CacheControl = “no-cache”;
        }
    }
}
2 голосов
/ 26 июня 2009

Я в итоге установил причину дублирования запросов. Как я уже сказал, механизм, который я выбрал для выполнения вызовов Ajax, был с тегами Dynamic Script. Я создаю URL-адрес запроса, создал новый элемент Script и назначил URL-адрес свойству src ...

var script = document.createElement(“script”);
script.src = https://....”;

Затем выполнить скрипт, добавив его в заголовок документа. Важно отметить, что я использовал функцию добавления JQuery ...

$(“head”).append(script);

Внутри функции добавления JQuery ожидал, что я пытаюсь сделать Ajax-вызов. Если тип добавляемого элемента - Script, тогда он выполняет специальную процедуру, которая выполняет Ajax-запрос с использованием объекта XmlHttpRequest. Но сценарий все еще добавлялся к заголовку документа и выполнялся там же браузером. Отсюда двойной запрос.

  1. Первый пришел прямо из сценария - тот, который я собирался осуществить.
  2. Второе пришло из функции добавления JQuery. Это был запрос с суффиксом случайно сгенерированного аргумента строки запроса в форме «& _ = 123456789».

Я упростил вещи, предотвратив побочный эффект библиотеки JQuery. Я использовал встроенную функцию добавления ...

document.getElementByTagName(“head”).appendChild(script);

Один запрос теперь происходит так, как я намеревался. Я понятия не имел, что функция добавления JQuery может иметь такой существенный побочный эффект.

0 голосов
/ 23 июня 2009

См. Www.enhanceie.com/redir/?id=httpperf для дальнейшего обсуждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...