Development Tip

동일한 ASP.NET MVC 작업에 대한 여러 동시 AJAX 호출로 인해 브라우저가 차단되는 이유는 무엇입니까?

yourdevel 2020. 10. 24. 11:58
반응형

동일한 ASP.NET MVC 작업에 대한 여러 동시 AJAX 호출로 인해 브라우저가 차단되는 이유는 무엇입니까?


며칠 전 나는이 질문을했습니다.

$ .getJSON ()이 브라우저를 차단하는 이유는 무엇입니까?

동일한 컨트롤러 작업에서 거의 한 번에 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 세션 상태 개요 :

ASP.NET 세션 상태에 대한 액세스는 세션 당 배타적입니다. 즉, 두 명의 서로 다른 사용자가 동시에 요청하면 각 개별 세션에 대한 액세스가 동시에 부여됩니다. 그러나 동일한 세션에 대해 두 개의 동시 요청이 발생하면 (동일한 SessionID 값을 사용하여) 첫 번째 요청이 세션 정보에 독점적으로 액세스합니다. 두 번째 요청은 첫 번째 요청이 완료된 후에 만 ​​실행됩니다.

성가 시게도 몇 주 전에이 단락을 훑어 보았지만 굵은 문장의 영향을 완전히 받아들이지 않았습니다. 나는 간단하게 읽었했다 "세션 상태에 대한 액세스를 직렬화" 가 아니라 "당신이 세션 상태를 만지거나, 직렬화하지 상관없이 여부, 모든 요청을" 요청이 동일한 세션에서 온 경우.

다행히 ASP.NET MVC3에는 해결 방법이 있으며 세션없는 컨트롤러를 만들 수 있습니다. Scott Guthrie는 여기에서 이에 대해 이야기합니다.

ASP.NET MVC 3 (릴리스 후보 2) 발표

MVC3 RC2를 설치하고 프로젝트를 업그레이드했습니다. 문제의 컨트롤러를 장식하면 문제가 [SessionState(SessionStateBehavior.Disabled)]해결됩니다.

물론 일반적으로 몇 분 전에 Stack Overflow에서 이것을 발견했습니다.

비동기 컨트롤러가 jQuery를 통해 ASP.NET MVC의 요청을 차단합니다.


나는 이것을 재현하려고했지만 불가능했습니다. 내 테스트는 다음과 같습니다.

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
        ));
    }
});

참고 URL : https://stackoverflow.com/questions/4428413/why-would-multiple-simultaneous-ajax-calls-to-the-same-asp-net-mvc-action-cause

반응형