2009-03-05 6 views
8

Mam aplikację internetową i używam ajaxa, aby oddzwonić na mój serwer sieciowy w celu pobrania danych.IE zawiesza się na 5 minut podczas wywoływania synchronicznego xmlhttprequest

Czasami (na dość nieprzewidywalne momenty, ale to może być powielana) IE zawiesza się całkowicie w ciągu 5 minut (okno mówi nie odpowiada), a potem wraca i obiekt XMLHttpRequest reaguje z błędem 12002.

The Way I można go odtworzyć w następujący sposób.

  1. Otwórz okno (B) z okna głównego (A) za pomocą przycisku
  2. oknem nazywa synchronicznego AJAX (PROC1) po kliknięciu przycisku, aby otworzyć okno B. PROC1 Uruchamia plik.
  3. Nowe okno (B) ma kod ajax (PROC2) i wywołuje serwer asynchroniczny. Działa dobrze
  4. Użytkownik zamyka okno B po zakończeniu procesu PROC2, ale przed zwróceniem danych.
  5. W oknie głównym (a) użytkownik ponownie klika przycisk. PROC1 działa ponownie, ale teraz blokada wywołania send() trwa 5 minut.

Proszę o pomoc. Szukałem 3 dni.

Uwaga: * Nie mogę przetestować go w firefox (aplikacja nie jest firefox kompatybilny) * mam używać połączeń synchronicznych (tak to aplikacja jest skonstruowany i zajęłoby zbyt dużo dewelopera starań, aby go przepisać)

Dlaczego tak się dzieje i jak to naprawić?

+0

tylko sugestia , ale użyj Process Explorer i Process Monitor, aby dowiedzieć się, co dzieje się pod kaptur'? – Terry

Odpowiedz

1

Winsock błąd 12002 oznacza, że ​​następujące związki według msdn

ERROR_INTERNET_TIMEOUT 

12002 

The request has timed out. 

Winsock podstawowa obiektem przekazywania gniazdo do XMLHTTP IE więc żadnego błędu nie ów w zakresie błędu HTTP (300400500 itp) jest prawie zawsze winsock błąd.

Z twojego pytania nie wynika jednoznacznie, że po raz drugi pytano o ten sam zasób. Możesz wymusić dodanie nowego zasobu przez dołączenie:

'?uid=+'Math.random() 

Do adresu URL, który może rozwiązać problem.

innym rozwiązaniem może być dołączenie funkcji do zdarzenia "onbeforeunload" na obiekcie okna w celu wywołania abort() dowolnego aktywnego żądania XMLHTTP tuż przed zamknięciem okna B.

Mam nadzieję, że te 2 wskaźniki rozwiążą Twój błąd.

2

Dzięki za odpowiedź na Martijn.

To nie rozwiązało moich problemów. Myślę, że to, co widzę jest najlepiej opisane na tej stronie: http://bytes.com/groups/javascript/643080-ajax-crashes-ie-close-window

W mojej sytuacji mam niestabilne połączenie lub powolny serwer WWW, a gdy połączenie jest zbyt wolne, a przeglądarka i serwer nadal mają połączenie, zamarza.

7

Masz rację Jaap, jest to związane z limitem połączenia Internet Explorera wynoszącym 2.Z jakiegoś powodu IE nie zwalnia połączeń z żądaniami AJAX wykonanymi w zamkniętych oknach.

Mam bardzo podobną sytuację, tylko nieco prostsze:

  • kliknięcia użytkownika w Okno, aby otworzyć okno B
  • Okno B wykonuje wywołania AJAX, że trwa chwilę
  • przed powrotem wywołania AJAX , użytkownik zamyka okno B. Połączenie z tym wywołaniem "przecieka".
  • Powtórz 1 więcej czasu, aż oba dostępne połączenia są „wyciekły”
  • przeglądarka przestaje odpowiadać

jedną technikę można spróbować (wspomniane w artykule znalezionym), który wydaje się do pracy jest, aby przerwać XMLHttp żądanie w zdarzeniu zwalniania strony.

Więc coś takiego:

var xhr = null; 

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

Inną opcją jest użycie AJAX synchronicznych połączeń, które będą blokować aż do powrotu połączeń, głównie blokowania przeglądarki. To może, ale nie musi, biorąc pod uwagę twoją konkretną sytuację.

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

Wreszcie, jak wspomniano w innym miejscu, można dostosować maksymalną liczbę połączeń używanych przez IE w rejestrze. Oczekiwanie od użytkowników witryny, aby to zrobili, jest jednak nierealistyczne i nie rozwiąże problemu - wystarczy opóźnić to. Na marginesie, IE8 pozwoli na 6 równoczesnych połączeń.

+0

Użyłem rozwiązania abort, aby naprawić bardzo podobny problem w IE8 z ajaxem i otwierania i zamykania okien. Jednakże, aby przerwać i nie stracić odpowiedzi, której szukałem, musiałem użyć async: false w jQuery. W moim przypadku było to w porządku, ale oczywiście nie idealnie. Jednak przerywanie rozwiązało problem pustych nowych okien. Zobacz mój komentarz w http://stackoverflow.com/questions/446594/kill-ajax-requests-using-javascript-using-jquery dla trochę więcej szczegółów. –

2

Domyślnie program Internet Explorer umożliwia tylko dwa jednoczesne połączenia z tą samą witryną w celu pobrania. Jeśli spróbujesz strzelić więcej, I.E. zatrzymuje się aż do zakończenia jednego z poprzednich wniosków, w którym to momencie zostanie zakończony następny wniosek. Uważam (chociaż mogę się mylić), że zostało to wprowadzone, aby zapobiec przeciążaniu stron internetowych z wieloma jednoczesnymi pobraniami jednocześnie. Istnieje hack rejestru, aby ominąć tę blokadę.

znalazłem te instrukcje kopnięć w całym internecie, która łagodzi moje problemy - Nie mogę obiecać, to będzie działać w danej sytuacji, ale ograniczyć multi-connection jesteś obliczu wydaje powiązane:

  1. Kliknij przycisk Start i wybierz Uruchom.
  2. W linii Uruchom wpisz Regedt32.exe i naciśnij Enter. Spowoduje to uruchomienie Edytora rejestru
  3. Znajdź następujący klucz w rejestrze: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
  4. Kliknij przycisk Ustawienia internetowe.
  5. Teraz przejdź do menu Edycja wskaż polecenie Nowy
  6. kliknij przycisk Wartość DWORD
  7. Rodzaj MaxConnectionsPer1_0Server nazwy tej wartości DWORD.
  8. Kliknij dwukrotnie utworzony właśnie klucz MaxConnectionsPer1_0Server i wprowadź następujące informacje: Dane wartości: 10. Baza: dziesiętna.
  9. Po zakończeniu naciśnij OK.
  10. powtórz kroki od 4 do 9. Tym razem nazewnictwa kluczową MaxConnectionsPerServer i przypisanie mu te same wartości, jak wskazano w kroku 8.
  11. Po zakończeniu naciśnij OK
  12. Zamknij Edytor rejestru.

Oczywiście, użyłbym tych w połączeniu z abort(), wcześniej wspomniano. W tandemie powinni naprawić problem.

2

W rzeczywistości IE5 i IE6 zawiesza się podczas próby odebrania danych ze skryptu PHP. Powodem jest to, że te przeglądarki nie mogą zdecydować, kiedy wszystkie dane zostały odebrane, a połączenie można zamknąć. Tak więc czekają, aż połączenie wygaśnie (w ten sposób 5 lub 10 minut się zawiesi). Sposobem na rozwiązanie tego problemu jest poinformowanie przeglądarki o ilości danych, które otrzyma. W PHP można to zrobić za pomocą buforowania wyjściowego, na przykład:

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

Jest to rozwiązanie, gdy po prostu ładujesz normalną stronę internetową. Kiedy ktoś korzysta AJAX GET poprzez Microsoft.XMLHTTP sprzeciw wystarczy wysłać „Connection: close” nagłówek z żądania GET, jak

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

Wszystkie te wiadomości - Wyłączenie czytnika PDF .. i te rzeczy ... nie rozwiąże problemu ... Ale pewny strzał jest - Uruchom Windows Update .. zachować uptodate .. Ten problem zostanie rozwiązany przez siebie .. Doświadczenie mówi;)

HydTechie