Tengo un sitio donde ingreso un nombre de usuario/contraseña y hago clic en un botón de inicio de sesión. El botón de inicio de sesión crea un objeto XMLHttpRequest y lo desactiva.La primera XMLHttpRequest falla pero solo en IE9
En Chrome, Firefox, Opera, Safari, dispositivos Android, dispositivos iOS, esto funciona bien. IE9 funcionará fin siempre que esté en una dirección HTTP y no use HTTPS.
En HTTPS, IE9 se comporta de la siguiente manera:
La primera solicitud de inicio de sesión no vuelve nunca nada a cambio. La pantalla F12 muestra mi solicitud de inicio de sesión en la pestaña de red y todo se ve correcto. La pestaña de scripts nunca arroja un error. Simplemente no pasa nada.
Aquí está la parte loca: - Si hago clic en iniciar sesión por segunda vez, en realidad funciona. - Si hago clic en actualizar en el navegador y luego inicio de sesión, ¡eso también funcionará!
Estoy creando la solicitud de la siguiente manera:
var x = new XMLHttpRequest();
x.open("POST", "/Relative/URL/Path", true);
x.setRequestHeader("Content-Type", "text/plain");
x.onreadystatechange = function() {
if ((x.readyState == 4) && (x.status == 200)) {
// handle callback
}
}
x.send(my request);
Cuando esto falla, el depurador pasará de la línea x.send() en el código onreadystatechange. ReadyState será 1. Esta será la última vez que puedo depurar porque no ocurre nada más.
Cualquier idea sería muy apreciada.
[EDITAR]: Dejé una solicitud para ver qué pasaría. El evento onreadystatechange se disparó nuevamente con readyState = 4 y status = 12152. La vista de red en la pantalla F12 de IE9 muestra el resultado como Aborted y el tiempo tomado como 1589.07s. Una búsqueda en Google muestra que esto significa que la conexión se cerró en el servidor.
[EDIT 2]: Basado en un comentario a continuación Redirigí este código para usar simplemente el método ajax() de jQuery. Pensé que esto podría tener la oportunidad de eliminar el código malo de mi parte. No tal suerte. El mismo comportamiento ocurre.
$.ajax({
"url": sUrl,
"success": function (data, textStatus, x) {
workerCallback(data, id, "");
},
"error": function (x, testStatus, errorThrown) {
workerCallback("nc", id, errorThrown);
},
"contentType": "text/plain",
"data": JSON.stringify(req),
"dataType": "json",
"timeout": 1600000,
"type": "POST"
});
[ACTUALIZACIÓN FINAL:] He actualizado el código. Si se produce un tiempo de espera, simplemente vuelvo a publicar la misma solicitud, solo una vez. Todo el truco, pero funciona. A menos que alguien encuentre la solución, dividiré la recompensa entre algunas ideas útiles que la gente ha tenido a continuación.
¿Está limpio el caché? ¿Usó algo como Fiddler para ver si las solicitudes se cancelan? – epascarello
El caché está limpio. Gran sugerencia sobre el seguimiento de las solicitudes. Abrí WireShark (sniffer de red) y lo revisé. No puedo ver nada saliendo cuando hago clic en iniciar sesión la primera vez. ¡La segunda vez que veo las solicitudes! Pero IE dice que hizo la solicitud? – Paul
Busque el código de error: http://support.microsoft.com/kb/193625 – epascarello