다음 시나리오를 안정적으로 재현 할 수 있습니다.
- 서버에 AJAX 요청을 보내는 작은 HTML 페이지 만들기 (HTTP POST 사용)
- 네트워크 연결을 끊고 다시 연결
- IE가 실패 후 생성하는 패킷 모니터링
네트워크 연결에 실패한 후 IE는 다음 AJAX 요청을하지만 HTTP 게시를 수행 할 때 본문이 아닌 HTTP 헤더 만 보냅니다 . 이것은 단지 부분적인 요청이기 때문에 서버에 모든 종류의 문제를 일으 킵니다. Bing에서이 문제를 해결하면 AJAX를 사용하는 “무작위 서버 오류”또는 설명 할 수없는 AJAX 오류에 대해 불평하는 많은 사람들을 찾을 수 있습니다.
대부분의 다른 브라우저와 달리 IE는 항상 두 개의 TCP / IP 패킷으로 HTTP POST를 보냅니다. 헤더와 본문은 별도로 전송됩니다. 실패 직후의 경우 IE는 헤더 만 보냅니다 . IE는 페이로드를 보내지 않으며 서버는 결국 Timeout으로 응답합니다.
그래서 내 질문은-왜 이런 식으로 작동합니까? HTTP 사양에 따라 잘못된 것으로 보이며 다른 브라우저는 이러한 방식으로 작동하지 않습니다. 단순히 버그입니까? 확실히 이것은 심각한 AJAX 기반 웹 애플리케이션에 혼란을 야기합니다.
참조 정보 :
1 분 미만의 HTTP 연결 유지 제한 시간에 의해 트리거되는 유사한 문제가 있으며 여기에 설명되어 있습니다.
http://support.microsoft.com/default.aspx?kbid=831167
답변
이 질문에 대한 명확한 답이없는 것 같으므로 대체로 경험적 데이터를 제공하고이를 해결할 수있는 몇 가지 방법을 제공하겠습니다. 아마도 MS 내부자가 언젠가 이것에 대해 밝힐 것입니다 …
-
HTTP Keep-Alive가 서버에서 비활성화 되면이 문제는 사라집니다. 즉, HTTP 1.1 서버는 응답에 한
Connection: Close
줄로 모든 Ajax 요청 에 응답합니다. 이것은 IE를 행복하게 유지하지만 모든 Ajax 요청이 새 연결을 열도록합니다. 이는 특히 대기 시간이 긴 네트워크에서 성능에 상당한 영향을 미칠 수 있습니다. -
Ajax 요청이 빠르게 연속적으로 이루어지면 문제가 쉽게 트리거됩니다. 예를 들어 100ms마다 Ajax 요청을하고 네트워크 상태가 변경되면 오류를 쉽게 재현 할 수 있습니다. 대부분의 응용 프로그램은 이러한 요청을하지 않을 수 있지만이 문제를 일으킬 수있는 서버 호출이 서로 연속해서 발생하는 경우가 있습니다. 수다스럽지 않으면 IE가 행복해집니다.
-
NTLM 인증 없이도 발생합니다.
-
서버의 HTTP 연결 유지 제한 시간이 기본값 (Windows에서는 기본적으로 60 초)보다 짧을 때 발생합니다. 문제의 링크에 제공된 세부 정보.
-
Chrome 또는 Firefox에서는 발생하지 않습니다. FF는 하나의 패킷을 보내므로이 문제를 모두 피하는 것 같습니다.
-
IE 6, 7, 8에서 발생합니다. IE 9 베타에서는 재현 할 수 없습니다.
답변
Microsoft Internet Explorer 또는 다른 프로그램을 사용하여 re-POST 작업을 수행 할 때 제목이 붙은 Microsoft KB 문서 는 헤더 데이터 만 게시 되어이 문제를 해결하는 것으로 보입니다.
이 문서에서는 핫픽스를 제공합니다. IE8과 같은 최신 브라우저의 경우 핫픽스가 이미 포함되어 있지만 클라이언트 PC의 레지스트리 설정을 통해 활성화해야합니다 .
답변
일부 이전 버전의 IE가 POST 본문이 아닌 헤더 만 다시 보내는 유사한 문제가 발생했습니다. 내 문제는 IE 및 NTLM과 관련된 것으로 밝혀졌습니다. NTLM에 대해 언급하지 않았기 때문에 도움이되지 않을 수 있지만 다음과 같은 경우에만 해당됩니다.
http://support.microsoft.com/kb/251404
답변
이것은 장기적이지만 IE (및 Firefox)는 때때로 HTTP 요청에 사용하는 연결을 “기억”합니다. 참고 / 예 :
-
Firefox에서 프록시 설정을 변경하고 페이지에서 SHIFT-RELOAD를 누르면 여전히 이전 프록시를 사용합니다. 그러나 이전 프록시 ( “killall squid”)를 종료하면 새 프록시를 사용하기 시작합니다.
-
연결을 끊거나 다시 연결할 때 새 IP 주소 또는 이와 유사한 주소를 받습니까? IE가 현재 죽은 주소로 데이터를 보내고 있는지 확인하기 위해 어떻게 든 이전 IP 주소를 모니터링 할 수 있습니까?
-
내 생각 엔 IE가 잘못된 경로로 데이터를 보내고 있다는 것입니다. “POST”패킷에 대한 네트워크 연결을 캐시하지 않을만큼 스마트 할 수 있지만 POST 페이로드에 대해서는이를 수행 할만큼 스마트하지 않을 수 있습니다.
-
사람들이 네트워크 연결을 끊고 다시 연결하는 일이 거의 없기 때문에 대부분의 AJAX 앱에는 영향을 미치지 않을 것입니다.
답변
NTLM 인증을 사용하고 있습니까?
NTLM 인증을 사용할 때 IE는 사후 데이터를 보내지 않습니다. 헤더 정보를 보내고 승인되지 않은 응답이 전송 될 것으로 예상하고 ‘재 인증’이 게시물을 보낸 후.
답변
오늘 $ .ajax를 사용할 때 비슷한 문제가 발생했으며 async를 false로 설정하여 해결할 수있었습니다.
$.ajax({
async: false,
url: '[post action url]',
data: $form.serialize(),
type: 'POST',
success: successCallback
});