JQuery Ajax post параметры иногда не отправляются на IE
Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую jQuery ajax post, с очень низкой частотой (
Когда я переключаю вызов с типа "post" на тип "get", проблема исчезает.
Кто-нибудь еще когда-нибудь видел такое странное поведение на IE? Спасибо!
Я видел это для различных вызовов ajax, но вот типичный пример:
var data= {
"guess" : "m1",
"eas" : "hello world"
};
$.ajax({
url: "http://myco.com/ajaxcall.action",
data: data,
type : 'post',
dataType: 'json',
success: function(data) {},
error: function() {}
});
Update : передача "cache: false" не устраняет проблему.
4 ответов:
Я провел последнюю неделю, отслеживая аналогичную проблему в моем собственном приложении (использует Dojo, а не JQuery). Судя по вашему описанию и частоте встречаемости, я бы сказал, что это одна и та же проблема.
Когда между браузером и сервером используются постоянные соединения HTTP (поведение по умолчанию), соединение HTTP может быть закрыто сервером в любое время. Это создает очень маленькую временную дыру, когда браузер начинает отправлять новый запрос одновременно с закрытием сервера. соединение. Большинство браузеров используют другое соединение или открывают новое соединение и повторно отправляют запрос. Это поведение, предложенное в разделе 8.1.4 RFC 2616:
Клиент, сервер или прокси-сервер могут закрыть транспортное соединение в любое время. время. Например, клиент может начать отправлять новый запрос одновременно с этим сервер принял решение закрыть "idle" соединение. С точки зрения сервера, соединение осуществляется закрыто, пока оно простаивало, но с точки зрения клиента, a запрос находится в процессе выполнения.
Это означает, что клиенты, серверы и прокси-серверы должны иметь возможность восстановления из асинхронных близких событий. Клиентское программное обеспечение должно снова открыть транспортное соединение и повторная передача прерванной последовательности запросов без взаимодействия с пользователем, пока последовательность запросов идемпотент (см. раздел 9.1.2).
Internet explorer пытается ли повторно отправить запрос, когда это происходит, но если это сообщение, оно искажает его, отправляя заголовки (с длиной содержимого), но без фактических данных. Это неправильный запрос и всегда должен приводить к ошибке HTTP (обычно после некоторого таймаута ожидания данных, которые никогда не приходят).
Эта ошибка документирована Microsoft в качестве КБ 895954 (см. http://support.microsoft.com/kb/895954). Microsoft впервые признала этот баг в IE 6. Они предоставили исправление и, кажется, отправили исправление с каждой версией IE с тех пор в том числе IE 9. Есть две проблемы с исправлением:
Исправление не активировано по умолчанию. Вы должны создать действительно странный ключ с помощью regedit, чтобы активировать исправление: HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_SKIP_POST_RETRY_ON_INTERNETWRITEFILE_KB895954.
Исправление на самом деле не устраняет проблему. "Фиксированное" поведение заключается в том, что когда соединение закрывается при попытке отправить запрос, оно не делает этого. даже попробуй отправить его повторно. Он просто передает ошибку вместе с приложением javascript.
Похоже, что вы должны добавить обработчики ошибок в свой код и повторно отправить запрос самостоятельно, если он не выполняется. Я ищу это решение для своего приложения. Меня беспокоит то, что я не знаю, как сказать, вызвана ли ошибка, которую я получаю, неудачной попыткой отправить запрос или какой-то ошибкой, отправленной с сервера в результате запроса (в этом случае я не хочу повторно отправлять запрос). он).
Я написал программу на языке Си для имитации веб-сервера и явного закрытия соединения, чтобы посмотреть, как браузер обрабатывает его. Я обнаружил, что IE воспроизводит ошибочное поведение 100% времени, в то время как Firefox, Safari и Chrome восстанавливаются, правильно отправляя сообщение на другом соединении 100% времени. Возможно, ответ таков: "Не используйте IE."
В качестве прямого ответа на ваш вопрос: Да, мы только что столкнулись с этим вопросом и не смогли найти разумного объяснения. Это влияет только на IE и с очень низкой частотой-потребовалось много времени, чтобы прийти к выводу, что это спорадический jQuery Ajax в IE ошибка. Мы должны были "исправить" проблему, вернув ошибку с сервера при этом условии и повторно разместив данные после 1-секундной задержки!
Чертовски хитрый, но, похоже, единственный выход.
Столкновения определенно не было. с элементами DOM и т. д. и нет никакой логической причины для этого, страница может быть обновлена много раз пользователем успешно с периодическими сбоями.
Должно быть ошибка.
Я думаю, что вы должны предотвратить кэширование в Internet Explorer. Попробуйте установить параметр кэш в false.
Пример:
$.ajax({ url: "http://myco.com/ajaxcall.action", data: data, type : 'post', dataType: 'json', success: function(data) {}, error: function() {}, cache: false });
Парамы, отправленные на PHP, принимаются от IE в
GET:$.ajax ({ url: "path/to/ajax.php" ,method: "POST" ,data: { var1: "value1" ,var2: true ,varX: 123123 } ,cache: false ,success: function (data) { alert (data); } });Тогда на PHP вы должны использовать REQUEST вместо POST:
$var1 = $_REQUEST ["var1"]; // value1 $var2 = $_REQUEST ["var2"]; // true $var3 = $_REQUEST ["var3"]; // 123123Этот пример может использовать его для совместимости с IE7
Comments