Programing

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

crosscheck 2020. 7. 26. 12:25
반응형

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


다음 시나리오를 안정적으로 다시 만들 수 있습니다.

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

네트워크 연결이 실패하면 IE는 다음 AJAX 요청을하지만 HTTP 게시를 수행 할 때 본문이 아닌 HTTP 헤더 만 보냅니다 . 이것은 부분 요청 일 뿐이므로 서버에 모든 종류의 문제가 발생합니다. Bing과 관련된이 문제는 Google에서 AJAX 또는 설명 할 수없는 AJAX 오류를 사용하여 "임의 서버 오류"에 대해 불평하는 많은 사람들을 발견하게됩니다.

우리는 IE (대부분의 다른 브라우저와 달리)는 항상 HTTP POST를 두 개의 TCP / IP 패킷으로 보냅니다. 헤더와 본문은 별도로 전송됩니다. 실패 직후에 IE는 헤더 만 보냅니다 .

그래서 내 질문은-왜 이런 식으로 행동합니까? 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

실패 전후 패킷 캡처는 다음과 같습니다.

HTTP 헤더 및 페이로드가 어떻게 전송되는지 확인하십시오 http://img827.imageshack.us/i/beforee.png/

실패 후 헤더 만 전송되는 방법을 확인하십시오. IE 는 페이로드를 보내지 않으며 서버는 결국 타임 아웃으로 응답합니다. http://img203.imageshack.us/i/retryt.png/


이 질문에 대한 명확한 대답은없는 것 같습니다. 따라서 경험적 데이터를 대체물로 제공하고 해결할 수있는 방법을 제공 할 것입니다. 아마 일부 MS 내부자는 언젠가 이것에 약간의 빛을 비출 것입니다 ...

  1. 서버에서 HTTP Keep-Alive가 비활성화 되어 있으면 이 문제는 사라집니다. 즉, HTTP 1.1 서버는 모든 Ajax 요청 Connection: Close에 응답 라인으로 응답합니다. 이렇게하면 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 또는 다른 프로그램을 사용하여 다시 POST 작업을 수행 할 때 제목 이 게시 된 경우에만 이 문제를 해결하는 것으로 보입니다.

이 문서는 핫픽스를 제공합니다. 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
});

참고 URL : https://stackoverflow.com/questions/4796305/why-does-internet-explorer-not-send-http-post-body-on-ajax-call-after-failure

반응형