동일한 ASP.NET MVC 작업에 대한 여러 동시 AJAX 호출로 인해 브라우저가 차단되는 이유는 무엇입니까?
며칠 전 나는이 질문을했습니다.
동일한 컨트롤러 작업에서 거의 한 번에 6 개의 jQuery 비동기 ajax 요청을 실행합니다. 각 요청이 반환되는 데 10 초가 걸립니다.
작업 메서드에 대한 디버깅 및 로깅 요청을 통해 요청이 직렬화되고 병렬로 실행되지 않음을 알 수 있습니다. 즉, 내 log4net 로그에 다음과 같은 타임 라인이 표시됩니다.
2010-12-13 13 : 25 : 06,633 [11164] 정보-확인 : 1156 2010-12-13 13 : 25 : 16,634 [11164] 정보-반환 : 1156 2010-12-13 13 : 25 : 16,770 [7124] INFO-Got : 1426 2010-12-13 13 : 25 : 26,772 [7124] 정보-반환 : 1426 2010-12-13 13 : 25 : 26,925 [11164] INFO-Got : 1912 2010-12-13 13 : 25 : 36,926 [11164] 정보-반환 : 1912 2010-12-13 13 : 25 : 37,096 [9812] INFO-Got : 1913 2010-12-13 13 : 25 : 47,098 [9812] 정보-반환 : 1913 2010-12-13 13 : 25 : 47,283 [7124] 정보-가져 오기 : 2002 2010-12-13 13 : 25 : 57,285 [7124] 정보-반환 : 2002 2010-12-13 13 : 25 : 57,424 [11164] INFO-Got : 1308 2010-12-13 13 : 26 : 07,425 [11164] 정보-반환 : 1308
FireFox의 네트워크 타임 라인을 보면 다음과 같습니다.
위의 로그 샘플과 Firefox 네트워크 타임 라인은 동일한 요청 세트에 대한 것입니다.
동일한 페이지에서 동일한 작업에 대한 요청이 직렬화됩니까? Session
동일한 세션 의 개체에 대한 직렬화 된 액세스를 알고 있지만 세션 데이터는 건드리지 않습니다.
클라이언트 측 코드를 단일 요청 (가장 오래 실행되는 요청)으로 제거했지만 여전히 브라우저를 차단합니다. 즉, ajax 요청이 완료 될 때만 브라우저가 링크 클릭에 응답합니다.
내가 여기서 관찰하는 것은 (Chrome의 개발자 도구에서) 장기간 실행되는 ajax 요청이 실행될 때 링크를 클릭하면 Failed to load resource
브라우저가 ajax를 죽였다 (또는 죽이고 대기하려고 시도하고 있음)을 암시 하는 오류를 즉시 보고 한다는 것입니다. 의뢰:
그러나 브라우저는 여전히 새 페이지로 리디렉션하는 데 시간이 걸립니다.
ajax 요청은 정말 비동기 적입니까, 아니면 자바 스크립트가 실제로 단일 스레드이기 때문에이 손재주입니까?
내 요청이 작동하는 데 너무 오래 걸리나요?
문제는 Firefox와 IE에서도 발생합니다.
또한 스크립트를 $.ajax
직접 명시 적으로 사용하도록 변경했습니다 async: true
.
나는 이것을 IIS7.5에서 실행하고 있으며, Windows 2008R2와 Windows 7 버전 모두 동일한 작업을 수행합니다.
디버그 및 릴리스 빌드도 동일하게 작동합니다.
대답은 나를 쳐다보고 있었다.
ASP.NET 세션 상태에 대한 액세스는 세션 당 배타적입니다. 즉, 두 명의 서로 다른 사용자가 동시에 요청하면 각 개별 세션에 대한 액세스가 동시에 부여됩니다. 그러나 동일한 세션에 대해 두 개의 동시 요청이 발생하면 (동일한 SessionID 값을 사용하여) 첫 번째 요청이 세션 정보에 독점적으로 액세스합니다. 두 번째 요청은 첫 번째 요청이 완료된 후에 만 실행됩니다.
성가 시게도 몇 주 전에이 단락을 훑어 보았지만 굵은 문장의 영향을 완전히 받아들이지 않았습니다. 나는 간단하게 읽었했다 "세션 상태에 대한 액세스를 직렬화" 가 아니라 "당신이 세션 상태를 만지거나, 직렬화하지 상관없이 여부, 모든 요청을" 요청이 동일한 세션에서 온 경우.
다행히 ASP.NET MVC3에는 해결 방법이 있으며 세션없는 컨트롤러를 만들 수 있습니다. Scott Guthrie는 여기에서 이에 대해 이야기합니다.
MVC3 RC2를 설치하고 프로젝트를 업그레이드했습니다. 문제의 컨트롤러를 장식하면 문제가 [SessionState(SessionStateBehavior.Disabled)]
해결됩니다.
물론 일반적으로 몇 분 전에 Stack Overflow에서 이것을 발견했습니다.
나는 이것을 재현하려고했지만 불가능했습니다. 내 테스트는 다음과 같습니다.
private static readonly Random _random = new Random();
public ActionResult Ajax()
{
var startTime = DateTime.Now;
Thread.Sleep(_random.Next(5000, 10000));
return Json(new {
startTime = startTime.ToString("HH:mm:ss fff"),
endTime = DateTime.Now.ToString("HH:mm:ss fff")
}, JsonRequestBehavior.AllowGet);
}
그리고 전화 :
<script type="text/javascript" src="/scripts/jquery-1.4.1.js"></script>
<script type="text/javascript">
$(function () {
for (var i = 0; i < 6; i++) {
$.getJSON('/home/ajax', function (result) {
$('#result').append($('<div/>').html(
result.startTime + ' | ' + result.endTime
));
});
}
});
</script>
<div id="result"></div>
결과 :
13:37:00 603 | 13:37:05 969
13:37:00 603 | 13:37:06 640
13:37:00 571 | 13:37:07 591
13:37:00 603 | 13:37:08 730
13:37:00 603 | 13:37:10 025
13:37:00 603 | 13:37:10 166
그리고 FireBug 콘솔 :
보시다시피 AJAX 작업은 병렬로 적중됩니다.
최신 정보:
내 초기 테스트에서 .NET을 사용할 때 요청은 실제로 FireFox 3.6.12 및 Chrome 8.0.552.215에 대기열에있는 것 같습니다
$.getJSON()
. IE8에서 잘 작동합니다. 내 테스트는 ASP.NET MVC 2 프로젝트, VS2010, Cassini 웹 서버, Windows 7 x64 비트로 수행되었습니다.
지금은 대체 할 경우
$.getJSON()
에
$.get()
는 모든 브라우저에서 잘 작동합니다. 그것은 $.getJSON()
요청을 대기열에 넣을 수있는 무언가가 있다고 믿게합니다
. 아마도 jQuery 프레임 워크의 내부에 더 익숙한 사람이이 문제에 대해 더 많은 것을 밝힐 수있을 것입니다.
업데이트 2 :
설정 시도 cache: false
:
$.ajax({
url: '/home/ajax',
cache: false,
success: function (result) {
$('#result').append($('<div/>').html(
result.startTime + ' | ' + result.endTime
));
}
});
'Development Tip' 카테고리의 다른 글
TypeScript로 배열 항목을 어떻게 찾습니까? (0) | 2020.10.24 |
---|---|
파이썬 소스 코드를 읽고 싶습니다. (0) | 2020.10.24 |
Windows에서 __cdecl 또는 __stdcall? (0) | 2020.10.24 |
모든 표준 Android 아이콘 리소스는 어디에 있습니까? (0) | 2020.10.24 |
정적 변수는 언제 초기화됩니까? (0) | 2020.10.24 |