IE зависает на 5 минут при вызове синхронного xmlhttprequest - PullRequest
8 голосов
/ 05 марта 2009

У меня есть веб-приложение, и я использую ajax для обратного вызова на мой веб-сервер для получения данных.

Иногда (в довольно непредсказуемые моменты, но его можно воспроизвести) IE полностью зависает на 5 минут (в окне написано «Не отвечает»), а затем возвращается, и объект xmlhttprequest отвечает с ошибкой 12002.

Я могу воспроизвести его следующим образом.

  1. Откройте окно (B) из главного окна (A) с помощью кнопки
  2. Окно A вызывает синхронный ajax (PROC1) при нажатии кнопки, чтобы открыть окно B. PROC1 запускает файл.
  3. Новое окно (B) имеет код ajax (PROC2) и вызывает сервер асинхронно. Работает нормально
  4. Пользователь закрывает окно B после завершения PROC2, но до возвращения данных.
  5. В главном окне (а) пользователь снова нажимает кнопку. PROC1 запускается снова, но теперь вызовы send () блокируются на 5 минут.

Пожалуйста, помогите. Я искал 3 дня.

Обратите внимание: * Я не могу проверить это в Firefox (приложение не совместимо с Firefox) * У меня есть для использования синхронных вызовов (так устроено приложение, и переписать его потребуется слишком много усилий разработчика)

Почему это происходит и как это исправить?

Ответы [ 6 ]

7 голосов
/ 10 марта 2009

Вы правы, Jaap, это связано с лимитом подключений Internet Explorer 2. По какой-то причине IE не освобождает подключения к запросам AJAX, выполняемым в закрытых окнах.

У меня очень похожая ситуация, только немного проще:

  • Пользователь щелкает в окне A, чтобы открыть окно B
  • Окно B выполняет Ajax-вызов, который занимает некоторое время
  • Перед возвратом вызова Ajax пользователь закрывает окно B. Соединение с этим вызовом «просачивается».
  • Повторите еще 1 раз, пока оба доступных соединения не «утекут»
  • Браузер перестает отвечать на запросы

Один из способов, который вы можете попробовать (упомянутый в найденной статье), который, похоже, работает, - прервать запрос XmlHttp в событии unload страницы.

Так что-то вроде:

var xhr = null;

function unloadPage() {
  if( xhr !== null ) {
    xhr.abort();
  }
}

Другой вариант - использовать синхронные вызовы AJAX, которые будут блокироваться до тех пор, пока вызов не будет возвращен, по существу блокируя браузер. Это может или не может быть приемлемым, учитывая вашу конкретную ситуацию.

// the 3rd param is whether the call is asynchronous
xhr.open( 'get', 'url', false );

Наконец, как уже упоминалось, вы можете настроить максимальное количество подключений, которые IE использует в реестре. Однако ожидать, что посетители вашего сайта сделают это, нереально, и это на самом деле не решит проблему - просто отложите ее. Как примечание, IE8 собирается разрешить 6 одновременных подключений.

2 голосов
/ 09 марта 2011

IE5 и IE6 действительно зависают при попытке получить данные из скрипта PHP. Причина в том, что эти браузеры не могут решить, когда все данные были получены, и соединение может быть закрыто. Поэтому они ждут, пока не истечет время соединения (таким образом, 5 или 10 минут зависают) Чтобы решить эту проблему, нужно сообщить браузеру, сколько данных он получит. В PHP вы можете сделать это с помощью буферизации вывода, например, следующим образом:

ob_start();
echo $html_content;
header( 'Connection: close' );
header( 'Content-Length: '.ob_get_length() );
flush();
ob_end_flush();

Это решение, когда кто-то просто загружает обычную веб-страницу. Когда кто-то использует AJAX GET через объект Microsoft.XMLHTTP достаточно отправьте заголовок «Connection: close» с запросом GET, например

r.request.open( "GET", url, true );
r.request.setRequestHeader( "Connection", "close" );
r.request.send();
2 голосов
/ 10 марта 2009

По умолчанию Internet Explorer разрешает только два одновременных подключения к одному веб-сайту для загрузки. Если вы попытаетесь запустить больше, чем это, I.E. останавливается до тех пор, пока не завершится один из предыдущих запросов, и в этот момент следующий запрос будет завершен Я считаю (хотя я могу ошибаться) это было сделано для предотвращения перегрузки веб-сайтов с множеством одновременных загрузок одновременно. Для обхода этой блокировки есть взлом реестра.

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

  1. Нажмите кнопку «Пуск» и выберите «Выполнить».
  2. В строке Run введите Regedt32.exe и нажмите Enter. Это запустит редактор реестра
  3. Найдите следующий ключ в реестре: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
  4. Нажмите на ключ настроек Интернета.
  5. Теперь перейдите в меню «Правка», укажите «НОВЫЙ»
  6. щелкните Значение DWORD
  7. Введите MaxConnectionsPer1_0Server в качестве имени этого значения DWORD.
  8. Дважды щелкните по ключу MaxConnectionsPer1_0Server , который вы только что создали, и введите следующую информацию: Значение: 10. База: Десятичное число.
  9. Когда закончите, нажмите ОК.
  10. Повторите шаги с 4 по 9. На этот раз назовите ключ MaxConnectionsPerServer и присвойте ему те же значения, что указаны в шагах 8.
  11. Когда закончите, нажмите OK
  12. Закройте редактор реестра.

Конечно, я бы использовал их вместе с ранее упомянутым вызовом abort (). В тандеме они должны решить проблему.

2 голосов
/ 07 марта 2009

Спасибо, что ответили на Мартин.

Это не решило мои проблемы. Я думаю, что то, что я вижу, лучше всего описано на этом сайте: http://bytes.com/groups/javascript/643080-ajax-crashes-ie-close-window

В моей ситуации у меня нестабильное соединение или медленный веб-сервер, и когда соединение слишком медленное, а браузер и веб-сервер все еще имеют соединение, то зависает.

1 голос
/ 05 марта 2009

Ошибка Winsock 12002 означает следующее в соответствии с msdn

ERROR_INTERNET_TIMEOUT

12002

The request has timed out.

Winsock является базовым объектом передачи сокетов для XMLHTTP в IE, поэтому любая ошибка, не входящая в диапазон ошибок HTTP (300 400 500 и т. Д.), Почти всегда является ошибкой winsock.

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

'?uid=+'Math.random()

На URL, который может решить проблему.

другое решение может заключаться в том, чтобы прикрепить функцию к событию "onbeforeunload" в объекте окна для вызова abort () любого активного запроса XMLHTTP непосредственно перед закрытием окна B.

Надеюсь, что эти 2 указателя решат вашу ошибку.

0 голосов
/ 22 мая 2013

Все эти посты - отключение чтения PDF .. и все такое ... не решит вашу проблему ... Но уверен, что выстрел - RUN WINDOWS UPDATE .. держать в курсе .. Эта проблема решается сама собой .. Опыт говорит;)

HydTechie

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