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


114

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

  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


6
이것은 대답 할 가치가있는 훌륭하고 잘 정의 된 질문입니다. 불행히도 이것은 약간의 주제가 아닙니다. webmasters.stackexchange.com 또는 superuser.stackexchange.com 에서 더 나은지 확실하지 않습니다 .
스티븐

3
난 그냥 ... 함께 고개를 끄덕 것을 읽기 때문에 @ gilly3, 나는 뭔가 나와 함께 잘못 생각합니다
Ryley

1
@ gilly3 : 네덜란드어로 번역하면 'googelen'이 네덜란드어로 '웹 검색'을 의미하는 동사 (네덜란드어 사전에도 정의되어 있음)이므로 정확합니다. 예, 철자가 'googlen'이 아니라 'googelen'입니다. 이상 해요, 알아요. 그래서 그냥 이렇게 말할 수 있습니다 : 'Googel dit probleem met Bing.' 그리고 그것은 맞을 것입니다.

11
@ gilly3 : Bing은 무엇입니까? 구글링 할게요.
Rocket Hazmat 2011 년

5
"왜 이런 식으로 작동합니까?" - "Microsoft 직원은 대부분 훌륭하지만 DEC, Unix, Apple, Commodore 또는 기타 배경을 통해 디지털 시대에 들어온 우리와 근본적으로 다른 프로그래밍 문화의 일부입니다. 그리고 나머지 우리를 놀라게 만드는 일을하는 경향이 있습니다. 그들의 탁월함이 아니라 우리 나머지 사람들에게 단순하고 직접적인 일들의 과도한 복잡함과 완전한 부패에 말이죠 "?
jcomeau_ictx 2011 년

답변:


28

이 질문에 대한 명확한 답이없는 것 같으므로 대체로 경험적 데이터를 제공하고이를 해결할 수있는 몇 가지 방법을 제공하겠습니다. 아마도 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 베타에서는 재현 할 수 없습니다.


4
이 문제를 해결하는 다른 방법이 있습니까? 자바 스크립트 수정이 있습니까? 다양한 XMLHTTP 객체를 살펴 보았지만 여전히 문제를 해결하지 못했습니다.
Berlin Brown

11

Microsoft Internet Explorer 또는 다른 프로그램을 사용하여 re-POST 작업을 수행 할 때 제목이 붙은 Microsoft KB 문서 는 헤더 데이터 만 게시 되어이 문제를 해결하는 것으로 보입니다.

이 문서에서는 핫픽스를 제공합니다. IE8과 같은 최신 브라우저의 경우 핫픽스가 이미 포함되어 있지만 클라이언트 PC의 레지스트리 설정을 통해 활성화해야합니다 .


1
기사에서 언급하지 않은 IE10 에서이 문제가 발생합니다.
ClearCloud8

6
이 기사는 이제 IE11까지 언급하므로 수정되지 않은 것 같습니다.
peater

프로덕션 사이트에서이 문제가 발생한다고 생각합니다. 문제와 관련된 사용자 에이전트는 IE 8,9,10 및 11과 일치합니다.
millhouse

해결 방법을 찾은 사람이 있습니까? 특히 나는 307과 FF, Chrome, Safari를 새 엔드 포인트에 다시 게시합니다. IE는 그렇지 않습니다. 사용자에게 핫픽스 / 레지스트리 패치를 요청할 수 없습니다.
Brad Gunn 2015

2

일부 이전 버전의 IE가 POST 본문이 아닌 헤더 만 다시 보내는 유사한 문제가 발생했습니다. 내 문제는 IE 및 NTLM과 관련된 것으로 밝혀졌습니다. NTLM에 대해 언급하지 않았기 때문에 도움이되지 않을 수 있지만 다음과 같은 경우에만 해당됩니다.

http://support.microsoft.com/kb/251404


귀하의 링크는 IE 11에서 비슷한 문제 해결에 도움이되었다, 6 IIS
Harminder

1

이것은 장기적이지만 IE (및 Firefox)는 때때로 HTTP 요청에 사용하는 연결을 "기억"합니다. 참고 / 예 :

  • Firefox에서 프록시 설정을 변경하고 페이지에서 SHIFT-RELOAD를 누르면 여전히 이전 프록시를 사용합니다. 그러나 이전 프록시 ( "killall squid")를 종료하면 새 프록시를 사용하기 시작합니다.

  • 연결을 끊거나 다시 연결할 때 새 IP 주소 또는 이와 유사한 주소를 받습니까? IE가 현재 죽은 주소로 데이터를 보내고 있는지 확인하기 위해 어떻게 든 이전 IP 주소를 모니터링 할 수 있습니까?

  • 내 생각 엔 IE가 잘못된 경로로 데이터를 보내고 있다는 것입니다. "POST"패킷에 대한 네트워크 연결을 캐시하지 않을만큼 스마트 할 수 있지만 POST 페이로드에 대해서는이를 수행 할만큼 스마트하지 않을 수 있습니다.

  • 사람들이 네트워크 연결을 끊고 다시 연결하는 일이 거의 없기 때문에 대부분의 AJAX 앱에는 영향을 미치지 않을 것입니다.


2
문제가 마지막이라고 생각합니다. 나는 마이크로 소프트가 "드물게 발생 : 구현하지 않는다"정책을 사용한다고 생각한다. :)

1
소스에서 대상까지의 모든 HTTP 트래픽을 모니터링합니다. (a) 내 IP 주소가 변경되지 않았고 (b) 다른 항목을 보내려고 시도하지 않았 음을 확인할 수 있습니다. IE는 새 소켓을 열고 부분 요청을 보냅니다. 내가 MS 기사를 읽는 방식은 보안 업데이트 중 하나가 IE를 깨뜨렸다는 것입니다. 그런 다음이를 수정하기위한 패치를 만들었습니다. 그러나 예전의 "깨진"방식으로 작동하도록하려면이 레지스트리 키를 추가 할 수 있습니다. Retry_HeaderOnlyPOST_OnConnectionReset. 광기를 이해하려고 노력하는 것뿐입니다.
Dodgyrabbit 2011 년

마지막으로, 주기적으로 폴링하는 Ajax 앱이있는 경우 (예 : 10 초) 몇 시간 동안 열어두면이 오류가 항상 발생합니다. 아마도 Wi-Fi 연결이 끊어 지거나 네트워크가 약할 것입니다.하지만이 문제는 매우 현실적입니다.
Dodgyrabbit 2011 년

1

NTLM 인증을 사용하고 있습니까?

NTLM 인증을 사용할 때 IE는 사후 데이터를 보내지 않습니다. 헤더 정보를 보내고 승인되지 않은 응답이 전송 될 것으로 예상하고 '재 인증'이 게시물을 보낸 후.


NTLM 인증을 사용하지 않습니다. 익명의 요청으로 발생합니다.
Dodgyrabbit 2011 년

0

오늘 $ .ajax를 사용할 때 비슷한 문제가 발생했으며 async를 false로 설정하여 해결할 수있었습니다.

$.ajax({
  async: false, 
  url: '[post action url]',
  data: $form.serialize(),
  type: 'POST',
  success: successCallback
});

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.