La primera XMLHttpRequest falla pero solo en IE9

Tengo un sitio donde ingreso un nombre de usuario / contraseña y hago clic en un button de inicio de session. El button de inicio de session crea un object XMLHttpRequest y lo desactiva.

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 request de inicio de session nunca devuelve nada. La pantalla F12 muestra mi request de inicio de session en la pestaña de networking y todo se ve correcto. La pestaña de scripting nunca arroja un error. Simplemente no pasa nada.

Aquí está la parte loca: – Si hago clic en iniciar session por segunda vez, en realidad funciona. – Si hago clic en actualizar en el browser, y luego inicio de session, ¡eso también funcionará!

Estoy haciendo la request 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 () al código de estado onreadystate. 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 request para ver qué pasaría. El evento onreadystatechange se disparó nuevamente con readyState = 4 y status = 12152. La vista de networking en la pantalla F12 de IE9 muestra el resultado como Aborted y el time tomado como 1589.07s. Una búsqueda en Google muestra que esto significa que la connection se cerró en el server.

[EDIT 2]: Basado en un comentario a continuación, rehice 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 time de espera, simplemente vuelvo a publicar la misma request, solo una vez. Todo el truco, pero funciona. A less que alguien encuentre la solución, dividiré la recompensa entre algunas ideas útiles que la gente ha tenido a continuación.

3 Solutions collect form web for “La primera XMLHttpRequest falla pero solo en IE9”

Esto parece un problema extraño y es difícil probarlo sin hurgar en el código de un sitio https.

Si desea una solución rápida, puede intentar hacer una request inicial (ficticia) y luego cancelarla de inmediato con un breve setTimeout y realizar una segunda request (real).

Según su descripción, debería funcionar.

durante la debugging en la primera request esto vino a través de

enter image description here

Hay una publicación relacionada con este error exacto … IE 9 Error de Javascript c00c023f

El autor puso lo siguiente en el controller onreadystatechange

 if (xmlHttpRequest.aborted==true) { stopLoadAnimation(); return; } 

Esto puede ayudarlo a apuntar en la dirección correcta.

  • Los times de espera evitan que la request finalice en readyState 1 y luego se realiza debido a la detección de contenido.

  • Configure la authentication del cliente SSL en el formulario de inicio de session utilizando la configuration del server web

  • Inserte un elemento oculto (como una image) que haga reference a una URL que requiere authentication de cliente SSL

  • Use un hyperlink relativo al protocolo gif, como //example.com/image.gif , para evitar la vulnerabilidad de contenido mixto SEC7111

  • La URL del método abierto coincide con el dominio cuando se usa HTTP, pero no con HTTPS, lo que hace que la request falle, pero las requestes subsiguientes retroceden a la política de zona de security.

  • Utilice una comparación entre window.location.protocol y document.location.protocol para comprobar si el script se está ejecutando en el mismo context que la página

  • Enviar JSON como tipo de text/plain MIME text/plain puede activar el rastreo de contenido

  • Compare el encabezado Aceptar entre las requestes que fallan contra las que tienen éxito

  • El almacenamiento en caching HTTPS puede ser un problema

  • El encabezado de connection puede necesitar ser configurado

  • La configuration del proxy puede ser un problema

  • Los valores iniciales de respuesta del encabezado pueden ser demasiado grandes (por ejemplo, la descripción del estado HTTP tiene un límite de 512 caracteres)

  • document.readystate puede no estar completo en la request inicial, lo que causa problemas de ejecución prematura

  • Las comprobaciones de revocación de certificates pueden bloquear el POSTE JSON inicial, pero permiten requestes posteriores después de la callback GET

  • Las properties readyState y status se deben referencer usando el scope de callback en lugar de la variable x para evitar el uso del scope de cierre:


     function cb ()
       {
       if ((this.readyState === 4) && (this.status === 200)) 
         {
         // manejar la callback
         }
       }

     onreadystatechange = cb;
  • Autenticación básica con XMLHTTPRequest
  • Misterioso ~ 1min de retraso en HTTP POST entre el browser y Nginx
  • ¿Cuál es la syntax para hacer un XMLHTTPREQUEST entre dominios a un server FTP?
  • SCRIPT5: Acceso denegado en IE9 en xmlhttprequest
  • Hacer una request de dominio cruzado con encabezado de authentication
  • Cómo recibir datos POST en python al usar XMLHttpRequest ()
  • Usando XHR para enviar grandes cantidades de datos a través de POST
  • XMLHttpRequest pasando una variable al script php
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.