programing

장애 발생 후 Internet Explorer가 Ajax 콜에서 HTTP Post Body를 전송하지 않는 이유는 무엇입니까?

newnotes 2023. 3. 11. 09:28
반응형

장애 발생 후 Internet Explorer가 Ajax 콜에서 HTTP Post Body를 전송하지 않는 이유는 무엇입니까?

다음과 같은 시나리오를 확실하게 재현할 수 있습니다.

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

네트워크 접속에 실패하면 IE는 다음 AJAX 요구를 작성하지만 HTTP 포스트 실행 시 HTTP 헤더(본문이 아님)만 전송합니다.이로 인해 서버에 모든 종류의 문제가 발생합니다.이는 부분적인 요구이기 때문입니다.Bing에서 이 문제를 구글로 검색하면 AJAX를 사용하는 "랜덤 서버 오류" 또는 설명되지 않은 AJAX 장애에 대해 많은 사람들이 불만을 제기할 수 있습니다.

(다른 대부분의 브라우저와 달리) IE는 항상2 개의 TCP/IP 패킷으로서 HTTP POST 를 송신하는 것을 알고 있습니다.헤더와 본문은 개별적으로 송신됩니다.장애 발생 직후의 경우 IE는 헤더만 전송합니다.IE는 payload를 송신하지 않고, 서버는 타임 아웃으로 응답합니다.

그래서 제 질문은, 왜 이런 식으로 행동하느냐는 것입니다.HTTP 사양에 따라서는 잘못된 것 같습니다.다른 브라우저는 이렇게 동작하지 않습니다.단순한 버그인가요?이것은 확실히 심각한 AJAX 기반의 웹 어플리케이션에 대혼란을 일으킨다.

참조 정보:

HTTP 킵얼라이브 타임아웃이 1분 미만으로 트리거되어 여기에 기재되어 있는 경우에도 같은 문제가 있습니다.

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 킵얼라이브가 디세블로 되어 있는 경우, 이 문제는 해소됩니다.즉, HTTP 1.1 서버는 모든 Ajax 요구에 대해Connection: Close행이 표시됩니다.이것에 의해, IE는 happy 상태로 유지되지만, 모든 Ajax 요구는 새로운 접속을 클릭합니다.이는 특히 대기 시간이 긴 네트워크에서 성능에 큰 영향을 미칠 수 있습니다.

  2. Ajax 요청이 빠르게 연속적으로 이루어지면 이 문제가 쉽게 트리거됩니다.예를 들어 100ms마다 Ajax 요청을 하고 네트워크 상태가 바뀌면 오류가 재현되기 쉽습니다.대부분의 어플리케이션에서는 이러한 요구를 하지 않는 경우가 있습니다만, 이 문제의 원인이 되는 서버 콜이 여러 번 연속해서 발생하고 있는 경우가 있습니다.수다를 줄이면 IE가 즐거워진다.

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

  4. 서버의 HTTP 킵얼라이브타임아웃이 디폴트(Windows 의 경우는 디폴트 60 초)보다 짧은 경우에 발생합니다.해당 링크에서 제공되는 세부 정보.

  5. Chrome 또는 Firefox에서는 발생하지 않습니다.FF는 1개의 패킷을 송신하기 때문에, 이 문제를 회피할 수 있을 것 같습니다.

  6. IE 6, 7, 8에서 발생합니다. IE 9 베타에서는 재현할 수 없습니다.

Microsoft Internet Explorer 또는 다른 프로그램을 사용하여 재POST 작업을 실행하면 헤더 데이터만 게시되어 이 문제가 해결된 것으로 보입니다.

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

이전 버전의 IE에서는 POST 본문이 아닌 Header만 반송되는 유사한 문제가 있었습니다.나의 문제는 IE와 NTLM에 관련된 것으로 판명되었다.NTLM에 대해서는 언급하지 않았기 때문에, 이것은 도움이 되지 않을 가능성이 있습니다만, 만약을 위해서 다음과 같습니다.

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

이것은 가능성이 낮지만 IE(및 Firefox)는 HTTP 요청에 사용하는 연결을 "기억"할 수 있습니다.주의/예:

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

  • 연결 해제/재연결 시 새로운 IP 주소 또는 이와 유사한 정보가 수신됩니까?오래된 IP 주소를 감시하고 IE가 현재 비활성화된 주소로 데이터를 전송하고 있는지 여부를 확인할 수 있습니까?

  • IE가 잘못된 경로로 데이터를 전송하고 있는 것 같습니다.「POST」패킷의 네트워크 접속을 캐시하지 않는 것은 스마트하지만, POST payload의 경우는 스마트하지 않은 경우가 있습니다.

  • 네트워크 접속을 끊었다가 다시 접속하는 경우가 거의 없기 때문에 대부분의 AJAX 앱에는 영향이 없을 것입니다.

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

NTLM 인증을 사용하는 경우 IE는 포스트 데이터를 전송하지 않습니다.헤더 정보를 송신해, 부정한 응답 송신 허가를 상정해, 「재인증」이 투고를 송신한 후에 송신합니다.

저는 오늘 $.ajax를 사용했을 때 비슷한 문제가 발생하여 비동기식을 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

반응형