programing

같은 ASP에 대한 여러 AJAX 콜이 동시에 이루어지는 이유는 무엇입니까?NET MVC 작업으로 인해 브라우저가 차단됩니까?

copyandpastes 2023. 3. 27. 22:38
반응형

같은 ASP에 대한 여러 AJAX 콜이 동시에 이루어지는 이유는 무엇입니까?NET MVC 작업으로 인해 브라우저가 차단됩니까?

며칠 전에 나는 이런 질문을 했다.

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

동일한 컨트롤러 액션으로 6개의 jQuery async ajax 요청을 거의 동시에 실행합니다.각 요구가 반환되는 데 10초 걸립니다.

디버깅과 액션 메서드 로깅을 통해 요청이 직렬화되어 병렬로 실행되지 않음을 알 수 있습니다.log4net 로그에 다음과 같은 타임라인이 표시됩니다.

2010-12-13 13:25:06,633 [11164] 정보 - 취득:11562010-12-13 13:25:16,634 [11164] 정보 - 반환:11562010-12-13 13:25:16,770 [7124] 정보 - 취득:14262010-12-13 13:25:26,772 [7124] 정보 - 반환:14262010-12-13 13:25:26,925 [11164] 정보 - 취득:19122010-12-13 13:25:36,926 [11164] 정보 - 반환:19122010-12-13 13:25:37,096 [9812] 정보 - 취득:19132010-12-13 13:25:47,098 [9812] 정보 - 반환:19132010-12-13 13:25:47,283 [7124] 정보 - 취득:20022010-12-13 13:25:57,285 [7124] 정보 - 반환:20022010-12-13 13:25:57,424 [11164] 정보 - 취득:13082010-12-13 13:26:07,425 [11164] 정보 - 반환:1308

FireFox의 네트워크 타임라인을 보면 다음과 같습니다.

alt 텍스트

위의 로그 샘플과 Firefox 네트워크 타임라인은 모두 동일한 요청 집합에 대한 것입니다.

같은 페이지에서 같은 액션에 대한 요구가 시리얼화되어 있습니까?에 대한 시리얼 접속을 알고 있습니다.Session같은 세션에 있는 오브젝트이지만 세션데이터는 터치되지 않았습니다.

클라이언트 측 코드를 1개의 요구(가장 오래 실행 중인 요구)까지 제거했지만 브라우저는 여전히 차단됩니다. 즉, Ajax 요청이 완료된 경우에만 브라우저가 링크 클릭에 응답합니다.

의 개발자할 수 있는 중인 가 실행 때 했을 때 Ajax가 입니다.Failed to load resource: 입니까 해당 브라우저가 클리어된 오류(「kill」)Import했습니다. 요구:

alt 텍스트

그러나 브라우저가 새 페이지로 리디렉션하려면 시간이 걸립니다.

ajax 요청은 정말 비동기적인 것일까요?아니면 javascript가 실제로는 싱글 스레드이기 때문에 이런 속임수일까요?

제 요청이 효과가 나타나는데 시간이 너무 오래 걸립니까?

Firefox 및 IE에서도 문제가 발생.

또, 사용하는 스크립트를 변경했어요.$.ajax이고 으로 설정하다async: true.

IIS7.5에서 실행하고 있는데 Windows 2008R2와 Windows 7의 플레이버 모두 같은 기능을 합니다.

디버깅 빌드 및 릴리스 빌드도 동일하게 동작합니다.

그 대답은 내 얼굴을 똑바로 쳐다보는 것이었다.

ASP.NET 세션 상태 개요:

ASP에 액세스합니다.NET 세션 상태는 세션마다 배타적입니다.즉, 2개의 다른 사용자가 동시에 요구를 하면 각 세션에 대한 액세스가 동시에 허용됩니다.단, (같은 세션을 사용하여) 같은 세션에 대해2개의 동시 요구가 이루어진 경우ID 값) 첫 번째 요청은 세션 정보에 대한 배타적 액세스 권한을 가집니다. 두 번째 요청은 첫 번째 요청이 완료된 후에만 실행됩니다.

짜증스럽게도 나는 몇 주 전에 이 문장을 대강 훑어보았었다. 굵은 글의 완전한 임팩트를 이해하지 못했다.요구가 같은 세션에서 온 경우, 「세션 상태에의 액세스는 시리얼라이즈 됩니다」라고 하는 단순한 것으로, 「세션 상태에의 터치 여부에 관계없이, 모든 요구가 시리얼라이즈 됩니다」라고 하는 것은 아닙니다.

다행히 ASP에 작업이 있습니다.NET MVC3 및 세션리스 컨트롤러를 작성할 수 있습니다.Scott Guthrie는 이에 대해 다음과 같이 말합니다.

ASP를 발표합니다.NET MVC 3(릴리스 후보 2)

MVC3 RC2를 사용합니다.를 「」로 한다.[SessionState(SessionStateBehavior.Disabled)]문제를 해결합니다.

물론 몇 분 전 Stack Overflow에 다음과 같은 내용이 있습니다.

비동기 컨트롤러가 ASP에서 요청을 차단하고 있습니다.NET MVC ~jQuery

나는 이것을 재현하려고 했지만 할 수 없었다.테스트 결과는 다음과 같습니다.

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 콘솔:

alt 텍스트

보시다시피 AJAX 액션이 동시에 히트하고 있습니다.


갱신:

초기 테스트에서 요청은 실제로 FireFox 3.6.12 및 Chrome 8.0.552.215로 큐잉된 것으로 보입니다.IE8에서는 정상적으로 동작합니다$.getJSON().제 테스트는 ASP를 사용하여 수행되었습니다.NET MVC 2 프로젝트, VS2010, Cassini 웹 서버, Windows 7 x 64 비트.

이제 대체하면 $.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

반응형