2009-06-05 3 views
4

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

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

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

https://.../service.svc?criteria=john+smith

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

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

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

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

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

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

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

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

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

ответ

2

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

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

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

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

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

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

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

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

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

3

Я просто написал статью о том, как avoid caching of ajax requests :-)

Это в основном включает в себя не добавляя ни одного заголовки кэша на любой запрос 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”; 
     } 
    } 
} 
+0

Похож на очень хорошее начало в правильном направлении для меня. Я соглашусь скоро, если это поможет. Спасибо за быстрый ответ! –

0

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

Смежные вопросы