2017-03-15 4 views
0

ASP 페이지에서 ajax 호출을 만들었지 만 Fiddler를 사용하여 실제로는 항상 3 개의 호출이 있음을 알았습니다. 네트워크 전송 시간과 대역폭을 낭비하는 점진적으로 인증.Firefox는 하나의 Ajax 호출을 세 번의 HTTP 요청으로 바꾸는 방법, 적절한 Windows 인증없이 두 번의 호출을 피하는 방법

첫 번째 호출에는 인증 헤더가 없으며 서버는 HTTP 401.2 Unauthorized을 말하는 6 킬로바이트 페이지와 가장 가능성이 높은 원인에 대한 사용자 친숙한 정보 및 시도 할 수있는 사항으로 응답합니다.

이어서 두번째 요청은 추가 헤더와 함께 전송된다 같은

Not Authorized 
HTTP Error 401. The requested resource requires user authentication. 

이어서 제 요청이다

Authorization: NTLM ....(56 bytes base64)... 

이제 서버 간단한 341 바이트 HTML 메시지 단지 말하는 응답 다음과 같은 훨씬 긴 Auth 헤더가 함께 전송되었습니다.

Authorization: NTLM ....(688 bytes base64)... 

이제 코드 숨김에서 응답을 보내고, 내 자신의 14 바이트 JSON 메시지와 함께.

나에게는 처음 두 메시지 교환이있는 것이 낭비스러운 것처럼 보입니다. 얼마나 많은 6500 바이트의 처음 두 응답을 피하기 위해 항상 전체 인증 헤더를 보내고 유용한 14 바이트의 응답 만 얻으려면 아약스 호출을 얻으려고합니까?

xhrFields.withCredentials = true 설정을 추가하려고했지만 위의 동작은이 설정의 유무에 관계없이 나타납니다.

는 아약스 호출입니다 :

 $.ajax({ 
      type: "POST", 
      url: "Timeout_Test.aspx/GetAjax", 
      data: JSON.stringify(data), 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      xhrFields: { 
       withCredentials: true 
      }, 
      success: function (data, textStatus, jqXHR) {...}, 
      error: function (jqXHR, textStatus, errorThrown) {...} 
     }); 

같은 세션 타임 아웃 피하려고 내 실험을위한 자바 스크립트 ASP를 호출로 발생합니다

function get_asp() { 
     var xmlHttp = new XMLHttpRequest(); 
     xmlHttp.onreadystatechange = function() {...} 
     xmlHttp.withCredentials = true; 
     xmlHttp.open("GET", "Timeout_Test.aspx?type=keepalive", true); // true for asynchronous 
     xmlHttp.send(null); 
    } 

web.config가 포함

<authentication mode="Windows"/> 

페이지에 액세스하려면 Windows 로그인 이름을 입력해야합니다. e와 내 암호를 한 번. 이 페이지에는 간격 타이머가있는 단추와 일부 자바 스크립트 논리가 포함되어 있으며 매분마다 아약스 호출이 수행됩니다. 실제로 자바 스크립트가 로그인 자격 증명을 알고 있지만 Ajax 호출이 실제로 잘 작동합니다. 두 중간 401 오류 메시지는 자바 스크립트 코드에서 숨겨져 있으며 Fiddler http snooping 도구에 표시되는 것을 제외하고는 어디에도 표시되지 않습니다.

Firebug 디버그 세션은 하나의 성공적인 ajax 호출 만 보여 주며, Fiddler는 401에서 3 회의 HTTP 요청과 2 회의 오류 응답을 명확하게 보여줍니다. 나는 1 분마다 1 개의 ajax 호출 만 수행한다고 확신합니다. . 3 가지 반응은 약 1 초 정도의 빠른 반응입니다.

아니요, 총 35 밀리 초입니다. T.471에서 1 번, T.473에서 1 번 응답, T.487에서 Req2, T.489에서 Resp2, T.502에서 Resp3으로 마지막으로 Req3, T.505에서 Resp3, T는 18:22:12 . Fiddler 통계 창에 따르면.

Visual Studio 2015 C# 디버거를 사용하면 각 아약스 호출에 대해 코드 숨김이 한 번만 호출됩니다. 따라서 401 오류 응답을 사용하는 처음 두 요청은 코드 숨김에 도달하지 않고 웹 서버에만 도달했습니다.

파이어 폭스 브라우저는 ajax 호출로 자바 스크립트 코드를 해석하고 실행하면서 점차적으로 "자동으로"권한을 부여하여 세 가지 HTTP 요청을 처리하는 것으로 추측해야합니다.

질문 : Firefox가 첫 번째 두 가지 실패한 http 요청을 거치지 않고 Firefox의 세 번째 버전 만 수행하도록하려면 어떻게해야합니까?

+0

'항상 3 통화'3 통화는 브라우저에서 3 요청입니까? java-script와 ajax는 요청 당 단 하나의 호출이므로 요청하지 않으면 다른 호출이 생성되지 않습니다. 나는 더 많은 정보가 필요하다고 생각한다. – Seabizkit

+0

@Seabizkit 표시된 코드는 한 번 호출되지만 세 가지 요청이 발생합니다. 이것은 단지 바이올린을 사용하여 볼 수 있습니다. 코드가 성공하고 코드 숨김에서 최종 응답 만 반환하고 402 개의 오류 메시지가 모두 표시되지 않습니다. – Roland

+1

nah roland, 나는 불가능하다는 것을 99 % 확신합니다. '$ .ajax ({''1 호출, 문제는 다른 소스에서 왔음에 틀림 없다 ... – Seabizkit

답변

0

확인이 이상한 동작은 "동시에"발급 된 두 요청 간의 상호 작용에서 오는 것으로 보입니다. 나는 이미 ajax 호출과 asp 호출을위한 코드를 보여 주었다. 이 테스트 페이지는 ajax 및/또는 asp 호출로 세션 시간 초과 여부 및 방법을 확인합니다. 이 두 개가 서로 가까울 때 트리플 HTTP 요청이 표시됩니다.

더 일반적인 경우 우리는 ajax 호출 또는 asp 호출 중 하나만 있으며, 승인 헤더가 전혀없는 하나의 HTTP 요청 만 있습니다.

그런 경우 첫 번째 http 요청이 성공한 것처럼 브라우저 (Firefox)가 아닌 웹 서버 (IIS)에 문제가있는 것처럼 보입니다. 반면에 Firefox는 추가 헤더를 보내서 401에서 복구 할 수 있으므로 "버그"보다는 표준 HTTP 프로토콜 일 수 있습니다.

나는 정상적인 작동 에서처럼 두 가지 호출을 동시에 피할 수 있으므로이 상황에서 살 수 있습니다.