2009-03-05 5 views
8

Ho un'applicazione web e uso ajax per richiamare il mio server web per recuperare i dati.IE si blocca per 5 minuti durante la chiamata sincrona xmlhttprequest

(momenti in piuttosto imprevedibili, ma può essere riprodotto) A volte IE si blocca completamente per 5 minuti (la finestra dice che non risponde) e poi torna indietro e l'oggetto XMLHttpRequest risponde con l'errore 12002.

Il mio modo di può riprodurlo è come segue.

  1. finestra aperta (B) dalla finestra principale (A) con il pulsante
  2. Finestra A chiama ajax sincrona (PROC1) quando fa clic sul pulsante per aprire la finestra B. PROC1 Esegue file.
  3. La nuova finestra (B) ha codice ajax (PROC2) e chiama server asincrono. Funziona bene
  4. L'utente chiude la finestra B dopo PROC2 completata ma prima che i dati vengano restituiti.
  5. Nella finestra principale (a) l'utente fa clic nuovamente sul pulsante. PROC1 viene eseguito nuovamente, ma ora i blocchi di chiamata send() per 5 minuti.

Si prega di aiutare. Ho cercato 3 giorni.

Si prega di notare: * Non posso testare in Firefox (l'applicazione non è Firefox compatibile) * I devo di utilizzare le chiamate sincrone (questo è il modo in cui l'applicazione è costruita e sarebbe prendere troppo sviluppatore sforzo per riscriverlo)

Perché questo succede e come posso risolvere questo?

+0

Solo un suggerimento ma usa Process Explorer e Process Monitor per avere un'idea di cosa sta succedendo la foresta'? – Terry

risposta

1

Winsock errore 12002 indica il seguente secondo msdn

ERROR_INTERNET_TIMEOUT 

12002 

The request has timed out. 

Winsock è l'oggetto di trasferimento socket sottostante per XMLHTTP in IE cui qualsiasi errore non questo è nella gamma di errore HTTP (300.400.500 ecc) è quasi sempre un Winsock errore.

Ciò che non era chiaro dalla tua domanda è che la stessa risorsa viene interrogata la seconda volta. È possibile forzare una nuova risorsa non collegata aggiungendo:

'?uid=+'Math.random() 

All'URL che potrebbe risolvere il problema.

Un'altra soluzione potrebbe essere quella di associare una funzione all'evento "onbeforeunload" sull'oggetto finestra per chiamare abort() una richiesta XMLHTTP attiva appena prima che la finestra B venga chiusa.

Spero che questi 2 puntatori risolvano il bug.

2

Grazie per aver risposto a Martijn.

Non ha risolto i miei problemi. Credo che quello che sto vedendo è meglio descritta in questo sito: http://bytes.com/groups/javascript/643080-ajax-crashes-ie-close-window

Nella mia situazione che ho una connessione instabile o un server web lento e quando la connessione è troppo lenta e il browser e il server web hanno ancora una connessione poi congela.

7

Hai ragione Jaap, questo è correlato al limite di connessione di Internet Explorer di 2.Per qualche ragione, IE non rilascia connessioni alle richieste AJAX eseguite in finestre chiuse.

Ho una situazione molto simile, solo un po 'più semplici:

  • utente fa clic in Window A per aprire la finestra B
  • finestra B effettua una chiamata Ajax che vuole un po'
  • prima della chiamata restituisce Ajax , l'utente chiude la finestra B. La connessione a questa chiamata "perde".
  • Ripetere ancora 1 volta fino a quando entrambe le connessioni disponibili sono "trapelate"
  • browser non risponde

Una tecnica si può provare (citato in questo articolo che hai trovato) che sembra funzionare è quello di interrompere l'XmlHttp richiesta nell'evento di scarico della pagina.

Quindi qualcosa di simile:

var xhr = null; 

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

Un'altra opzione è quella di utilizzare sincrono chiamate AJAX, che bloccherà fino a quando la chiamata ritorna, in sostanza, il blocco del browser. Questo può o non può essere accettabile data la tua particolare situazione.

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

Infine, come accennato altrove, è possibile regolare il numero massimo di connessioni utilizzate da IE nel registro. Tuttavia, aspettarsi che i visitatori del tuo sito lo facciano non è realistico, e in realtà non risolverà il problema, ma solo ritardarlo. Come nota a margine, IE8 consentirà 6 connessioni simultanee.

+0

Ho utilizzato una soluzione di interruzione per risolvere un problema molto simile in IE8 con ajax e finestre di apertura e chiusura. Tuttavia, per abortire e non perdere la risposta che stavo cercando, dovevo usare async: false in jQuery. Questo nel mio caso andava bene, ma ovviamente non era l'ideale. Tuttavia, l'annullamento ha risolto il problema di nuove finestre vuote. Vedi il mio commento in http://stackoverflow.com/questions/446594/kill-ajax-requests-using-javascript-using-jquery per ulteriori dettagli. –

2

Per impostazione predefinita, Internet Explorer consente solo due connessioni simultanee allo stesso sito Web per il download. Se cerchi di accendere più di questo, I.E. si blocca fino a quando una delle richieste precedenti non termina il punto in cui verrà completata la richiesta successiva. Credo che (anche se potrei sbagliarmi) questo è stato messo in atto per prevenire il sovraccarico di siti Web con molti download simultanei alla volta. C'è un hack del registro per aggirare questo blocco.

ho trovato queste istruzioni calci in giro per internet, che alleviato i miei problemi - non posso promettere che funzionerà per la vostra situazione, ma limitare la multi-connessione che si sta affrontando appare correlato:

  1. Fare clic sul pulsante Start e selezionare Esegui.
  2. Nella riga Esegui digitare Regedt32.exe e premere Invio. Questo lancerà l'Editor del Registro
  3. Individuare la seguente chiave di registro: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
  4. cliccare sul tasto impostazioni Internet.
  5. Ora andate al menu Modifica, scegliere Nuovo
  6. Valore DWORD
  7. Tipo MaxConnectionsPer1_0Server per il nome di questo valore DWORD.
  8. Fare doppio clic sulla chiave MaxConnectionsPer1_0Server appena creata e immettere le seguenti informazioni: Dati valore: 10. Base: decimale.
  9. Al termine, premere OK.
  10. Ripetere passaggi 4 tra 9. Questa volta nominare il tasto MaxConnectionsPerServer e assegnando gli stessi valori indicati ai punti 8.
  11. Al termine, premere OK
  12. Chiudere l'editor del registro.

Naturalmente, vorrei utilizzare questi in combinazione con la chiamata abort() menzionato in precedenza. In tandem, dovrebbero risolvere il problema.

2

IE5 e IE6, infatti, si bloccano quando si tenta di ricevere dati da uno script PHP. Il motivo è che questi browser non possono decidere quando sono stati ricevuti tutti i dati e la connessione può essere chiusa. Quindi aspettano fino alla scadenza della connessione (quindi il blocco di 5 o 10 minuti). Un modo per risolvere questo è dire al browser quanti dati riceverà. In PHP è possibile farlo usando il buffer di output, ad esempio come segue:

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

questa è una soluzione quando si è solo il caricamento di una pagina web normale. Quando si sta usando AJAX GET via Microsoft.XMLHTTP oggetto è sufficiente inviare il "Connessione: chiudere" intestazione con la richiesta GET, come

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

Tutti questi messaggi - Disabilita lettore PDF .. e quella roba ... non risolverà il vostro problema ... Ma certo colpo è - eseguire Windows Update .. mantenere uptodate .. Questo problema viene risolto da solo .. esperienza parla;)

HydTechie

Problemi correlati