Jesteśmy w stanie wiarygodnie odtworzyć następujący scenariusz:
- Utwórz małą stronę HTML, która wysyła żądania AJAX do serwera (przy użyciu HTTP POST)
- Odłącz się od sieci i połącz ponownie
- Monitoruj pakiety generowane przez IE po awarii
Po nieudanym połączeniu sieciowym IE wysyła następne żądanie AJAX, ale wysyła tylko plik nagłówek HTTP (nie treść) podczas wykonywania postu HTTP. Powoduje to różnego rodzaju problemy na serwerze, ponieważ jest to tylko częściowe żądanie. Wygoogluj ten problem z Bing, a znajdziesz wiele osób narzekających na „losowe błędy serwera” przy użyciu AJAX lub niewyjaśnionych awarii AJAX.
Wiemy, że IE (w przeciwieństwie do większości innych przeglądarek) zawsze wysyła HTTP POST jako DWA pakiety TCP / IP. Nagłówek i treść są wysyłane osobno. W przypadku bezpośrednio po awarii, IE wysyła tylko nagłówek . IE nigdy nie wysyła ładunku, a serwer ostatecznie odpowiada limitem czasu.
Więc moje pytanie brzmi - dlaczego tak się zachowuje? Wydaje się to błędne w oparciu o specyfikację HTTP, a inne przeglądarki nie zachowują się w ten sposób. Czy to po prostu błąd? Z pewnością powoduje to spustoszenie w każdej poważnej aplikacji internetowej opartej na technologii AJAX.
Informacje referencyjne:
Istnieje podobny problem, wywołany przez limity czasu podtrzymania aktywności HTTP, które są krótsze niż 1 minuta i jest udokumentowany tutaj:
źródło
Odpowiedzi:
Wydaje się, że nie ma jasnej odpowiedzi na to pytanie, więc jako substytut podam moje dane empiryczne i przedstawię sposoby obejścia tego problemu. Może jakiś insider MS pewnego dnia rzuci trochę światła na to ...
Jeśli HTTP Keep-Alive jest wyłączone na serwerze, ten problem zniknie. Innymi słowy, twój serwer HTTP 1.1 odpowie na każde żądanie Ajax
Connection: Close
linią odpowiedzi. To sprawia, że IE jest szczęśliwy, ale powoduje, że każde żądanie Ajax otwiera nowe połączenie. Może to mieć znaczący wpływ na wydajność, szczególnie w sieciach z dużymi opóźnieniami.Problem jest łatwo uruchamiany, jeśli żądania Ajax są wysyłane w krótkich odstępach czasu. Na przykład wysyłamy żądania Ajax co 100 ms, a następnie zmienia się stan sieci, błąd jest łatwy do odtworzenia. Chociaż większość aplikacji prawdopodobnie nie wysyła takich żądań, możesz mieć kilka wywołań serwera występujących bezpośrednio po sobie, co może prowadzić do tego problemu. Mniej gadatliwości sprawia, że IE jest zadowolona.
Dzieje się tak nawet bez uwierzytelniania NTLM.
Dzieje się tak, gdy limit czasu utrzymywania aktywności HTTP na serwerze jest krótszy niż domyślny (który domyślnie wynosi 60 sekund w systemie Windows). Szczegóły podane w odnośniku, o którym mowa.
Nie dzieje się tak w przypadku przeglądarki Chrome ani Firefox. FF wysyła jeden pakiet, więc wydaje się całkowicie unikać tego problemu.
Dzieje się tak w IE 6, 7, 8. Nie można odtworzyć z IE 9 beta.
źródło
Artykuł bazy wiedzy Microsoft zatytułowany Gdy używasz przeglądarki Microsoft Internet Explorer lub innego programu do ponownego wykonania operacji POST, publikowane są tylko dane nagłówka, które rozwiązują ten problem.
Artykuł zawiera poprawkę. W przypadku nowszych przeglądarek, takich jak IE8, jest napisane, że poprawka jest już dołączona, ale należy ją włączyć w ustawieniach rejestru na komputerze klienckim.
źródło
Miałem podobny problem, gdy niektóre starsze wersje IE odsyły tylko nagłówek, a nie treść POST. Mój problem okazał się być związany z IE i NTLM. Ponieważ nie wspomniałeś o NTLM, prawdopodobnie to nie pomoże, ale na wszelki wypadek:
http://support.microsoft.com/kb/251404
źródło
To długa perspektywa, ale IE (a nawet Firefox) czasami „pamięta” połączenie, którego używa do żądania HTTP. Uwagi / przykłady:
W Firefoksie, jeśli zmienię ustawienia proxy i wbiję SHIFT-RELOAD na stronie, nadal używa starego proxy. Jeśli jednak zabiję stare proxy („killall squid”), zacznie ono używać nowego proxy.
Czy po rozłączeniu / ponownym połączeniu otrzymujesz nowy adres IP lub coś podobnego? Czy możesz w jakiś sposób monitorować stary adres IP, aby sprawdzić, czy IE wysyła dane na ten teraz martwy adres?
Domyślam się, że IE wysyła dane, po prostu w złym kierunku. Może być wystarczająco sprytne, aby nie buforować połączeń sieciowych dla pakietów „POST”, ale może nie być wystarczająco inteligentne, aby robić to w przypadku ładunków POST.
Prawdopodobnie nie ma to wpływu na większość aplikacji AJAX, ponieważ ludzie rzadko rozłączają się i ponownie łączą z ich sieciami?
źródło
Czy używasz uwierzytelniania NTLM?
Podczas korzystania z uwierzytelniania NTLM IE nie wysyła danych końcowych. Wysyła informacje z nagłówka, oczekuje nieautoryzowanej autoryzacji wysłania odpowiedzi, a po „ponownym uwierzytelnieniu” wysyła wiadomość.
źródło
Miałem dziś podobny problem podczas używania $ .ajax i byłem w stanie go naprawić, ustawiając async na false.
źródło