[javascript] Internet Explorer가 실패 후 Ajax 호출에서 HTTP 게시물 본문을 보내지 않는 이유는 무엇입니까?

다음 시나리오를 안정적으로 재현 할 수 있습니다.

  1. 서버에 AJAX 요청을 보내는 작은 HTML 페이지 만들기 (HTTP POST 사용)
  2. 네트워크 연결을 끊고 다시 연결
  3. IE가 실패 후 생성하는 패킷 모니터링

네트워크 연결에 실패한 후 IE는 다음 AJAX 요청을하지만 HTTP 게시를 수행 할 때 본문이 아닌 HTTP 헤더 만 보냅니다 . 이것은 단지 부분적인 요청이기 때문에 서버에 모든 종류의 문제를 일으 킵니다. Bing에서이 문제를 해결하면 AJAX를 사용하는 “무작위 서버 오류”또는 설명 할 수없는 AJAX 오류에 대해 불평하는 많은 사람들을 찾을 수 있습니다.

대부분의 다른 브라우저와 달리 IE는 항상 두 개의 TCP / IP 패킷으로 HTTP POST를 보냅니다. 헤더와 본문은 별도로 전송됩니다. 실패 직후의 경우 IE는 헤더 만 보냅니다 . IE는 페이로드를 보내지 않으며 서버는 결국 Timeout으로 응답합니다.

그래서 내 질문은-왜 이런 식으로 작동합니까? HTTP 사양에 따라 잘못된 것으로 보이며 다른 브라우저는 이러한 방식으로 작동하지 않습니다. 단순히 버그입니까? 확실히 이것은 심각한 AJAX 기반 웹 애플리케이션에 혼란을 야기합니다.

참조 정보 :

1 분 미만의 HTTP 연결 유지 제한 시간에 의해 트리거되는 유사한 문제가 있으며 여기에 설명되어 있습니다.

http://us.generation-nt.com/xmlhttprequest-post-sometimes-fails-when-server-using-keep-aliv-help-188813541.html

http://support.microsoft.com/default.aspx?kbid=831167



답변

이 질문에 대한 명확한 답이없는 것 같으므로 대체로 경험적 데이터를 제공하고이를 해결할 수있는 몇 가지 방법을 제공하겠습니다. 아마도 MS 내부자가 언젠가 이것에 대해 밝힐 것입니다 …

  1. HTTP Keep-Alive가 서버에서 비활성화 되면이 문제는 사라집니다. 즉, HTTP 1.1 서버는 응답에 한 Connection: Close줄로 모든 Ajax 요청 에 응답합니다. 이것은 IE를 행복하게 유지하지만 모든 Ajax 요청이 새 연결을 열도록합니다. 이는 특히 대기 시간이 긴 네트워크에서 성능에 상당한 영향을 미칠 수 있습니다.

  2. Ajax 요청이 빠르게 연속적으로 이루어지면 문제가 쉽게 트리거됩니다. 예를 들어 100ms마다 Ajax 요청을하고 네트워크 상태가 변경되면 오류를 쉽게 재현 할 수 있습니다. 대부분의 응용 프로그램은 이러한 요청을하지 않을 수 있지만이 문제를 일으킬 수있는 서버 호출이 서로 연속해서 발생하는 경우가 있습니다. 수다스럽지 않으면 IE가 행복해집니다.

  3. NTLM 인증 없이도 발생합니다.

  4. 서버의 HTTP 연결 유지 제한 시간이 기본값 (Windows에서는 기본적으로 60 초)보다 짧을 때 발생합니다. 문제의 링크에 제공된 세부 정보.

  5. Chrome 또는 Firefox에서는 발생하지 않습니다. FF는 하나의 패킷을 보내므로이 문제를 모두 피하는 것 같습니다.

  6. 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
});


답변