2009-03-05 15 views
8

Tengo una aplicación web y uso ajax para devolver la llamada a mi servidor web para recuperar datos.IE colgar durante 5 minutos cuando se llama a synchronous xmlhttprequest

(en momentos bastante difíciles de pronosticar, pero puede ser reproducida) A veces IE cuelga por completo durante 5 minutos (la ventana dice que no responde) y luego regresa y el objeto XMLHttpRequest responde con el error 12002.

La forma en que puede reproducirlo de la siguiente manera.

  1. ventana abierta (B) de la ventana principal (A) utilizando el botón
  2. Ventana A llama Ajax síncrona (PROC1) cuando se hace clic en el botón para abrir la ventana B. PROC1 ejecuta el archivo.
  3. La nueva ventana (B) tiene el código ajax (PROC2) y llama al servidor asíncrono. Funciona bien
  4. El usuario cierra la ventana B después de que se haya completado PROC2 pero antes de que se devuelvan los datos.
  5. En la ventana principal (a) el usuario vuelve a hacer clic en el botón. PROC1 se ejecuta nuevamente pero ahora la llamada a send() bloquea durante 5 minutos.

Por favor ayuda. Estuve buscando por 3 días.

Tenga en cuenta: * No puede probarlo en Firefox (la aplicación no es Firefox compatibles) * I tengo utilizar llamadas síncronas (que es la forma en que se construye la aplicación y tardaría demasiado desarrollador esfuerzo para reescribirlo)

¿Por qué sucede esto y cómo solucionarlo?

+0

Sólo una sugerencia , pero use Process Explorer y Process Monitor para tener una idea de lo que sucede 'debajo la capucha'? – Terry

Respuesta

1

Winsock Error 12002 significa lo siguiente de acuerdo con msdn

ERROR_INTERNET_TIMEOUT 

12002 

The request has timed out. 

Winsock está el objeto de transferencia socket subyacente para XMLHTTP en IE por lo que cualquier error eso no es en el rango de error HTTP (300,400,500 etc) es casi siempre un Winsock error.

Lo que no quedó claro de su pregunta es si el mismo recurso se está consultando la segunda ronda. Se podría forzar un nuevo recurso sin caché añadiendo:

'?uid=+'Math.random() 

Para la URL que podría resolver el problema.

Otra solución podría ser adjuntar una función al evento "onbeforeunload" en el objeto ventana para llamar a abort() una solicitud XMLHTTP activa justo antes de que se cierre la ventana B.

Espero que estos 2 indicadores resuelvan su error.

2

Gracias por responder Martijn.

No resolvió mis problemas. Creo que lo que estoy viendo se describe mejor en este sitio web: http://bytes.com/groups/javascript/643080-ajax-crashes-ie-close-window

En mi situación en la que tienen una conexión inestable o un servidor web lento y cuando la conexión es demasiado lenta y el navegador y el servidor web todavía tienen una conexión a continuación, se congela

7

Tienes razón Jaap, esto está relacionado con el límite de conexión de Internet Explorer de 2.Por alguna razón, IE no libera conexiones a solicitudes AJAX realizadas en ventanas cerradas.

Tengo una situación muy similar, sólo un poco más simples:

  • El usuario hace clic en la ventana A para abrir la ventana B
  • Ventana B realiza una llamada Ajax que toma un tiempo
  • Antes de que vuelva la llamada Ajax , el usuario cierra la ventana B. La conexión a esta llamada "se filtra".
  • Repetir 1 más tiempo hasta que las dos conexiones disponibles son "filtrados"
  • navegador no responde

Una técnica que puede probar (mencionado en el artículo que has encontrado) que parece funcionar es abortar el XmlHttp solicitar en el evento de descarga de la página.

Así que algo como:

var xhr = null; 

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

Otra opción es el uso de AJAX sincrónica llamadas, que se bloqueará hasta que vuelva la llamada, el bloqueo esencialmente el navegador. Esto puede o no ser aceptable dada su situación particular.

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

Por último, como se ha mencionado en otras partes, se puede ajustar el número máximo de conexiones IE utiliza en el registro. Sin embargo, esperar que los visitantes de su sitio lo hagan no es realista, y en realidad no resolverá el problema, simplemente lo demorará. Como nota al margen, IE8 permitirá 6 conexiones concurrentes.

+0

Utilicé una solución abort para solucionar un problema muy similar en IE8 con ajax y abrir y cerrar ventanas. Sin embargo, para abortar y no perder la respuesta que estaba buscando tuve que usar async: false en jQuery. Esto estuvo bien en mi caso, pero obviamente no es ideal. Sin embargo, abortar solucionó el problema de ventanas nuevas y vacías. Vea mi comentario en http://stackoverflow.com/questions/446594/kill-ajax-requests-using-javascript-using-jquery para un poco más de detalle. –

2

Por defecto Internet Explorer sólo permite dos conexiones simultáneas a la misma página web para descarga. Si intentas disparar más que esto, I.E. se detiene hasta que una de las solicitudes anteriores finaliza, en ese punto se completará la próxima solicitud. Creo (aunque podría estar equivocado) que esto se implementó para evitar la sobrecarga de sitios web con muchas descargas simultáneas a la vez. Hay un truco de registro para eludir este bloqueo.

me encontré con estas instrucciones patadas alrededor de la Internet, que alivió mis problemas - No puedo prometer que trabajará para su situación, pero la conexión múltiple limitar estás frente parece estar relacionado con:

  1. Haga clic en el botón Inicio y seleccione Ejecutar.
  2. En la línea Ejecutar, escriba Regedt32.exe y presione Enter. Esto abrirá el Editor del Registro
  3. Busque la siguiente clave en el registro: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
  4. Haga clic en la clave de configuración de Internet.
  5. Ahora vaya al menú Edición, seleccione nuevo
  6. Valor DWORD
  7. Tipo MaxConnectionsPer1_0Server para el nombre de este valor DWORD.
  8. Haga doble clic en la clave MaxConnectionsPer1_0Server que acaba de crear e ingrese la siguiente información: Datos del valor: 10. Base: decimal.
  9. Cuando termine, presione OK.
  10. Repita los pasos 4 a 9. Esta vez la tecla nombrar MaxConnectionsPerServer y asignándole los mismos valores como se indica en los pasos 8.
  11. Cuando termine, pulse OK
  12. Cierre el Editor del Registro.

Por supuesto, me gustaría utilizar estos en conjunción con la llamada de interrupción() anteriormente mencionado. En conjunto, deberían solucionar el problema.

2

IE5 e IE6, de hecho, se cuelgan al intentar recibir datos de un script PHP. La razón es que estos navegadores no pueden decidir cuándo se han recibido todos los datos y se puede cerrar la conexión. Así que esperan hasta que la conexión expire (por lo tanto, el bloqueo de 5 o 10 minutos). Una forma de resolver esto es decirle al navegador la cantidad de datos que recibirá. En PHP que puede hacer que el uso de búferes de salida, por ejemplo, de la siguiente manera:

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

Esta es una solución cuando uno se acaba de cargar una página web normal. Cuando uno está utilizando AJAX obtener a través de Microsoft.XMLHTTP objetar que es suficiente para enviar el "Conexión: cerrar" encabezado con la solicitud GET, como

r.request.open("GET", url, true); 
r.request.setRequestHeader("Connection", "close"); 
r.request.send(); 
0

Todos estos puestos lector de PDF - Desactivar .. y esas cosas ... no va a resolver su problema ... Pero tiro seguro es - ejecutar Windows Update .. mantener uptodate .. Este problema se resuelve por sí mismo .. experiencia habla;)

HydTechie

Cuestiones relacionadas