이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 29669|회답: 3

[ASP.NET] 페이지에 동시에 여러 요청이 ASP.NET 경우, 차단 상태가 발생합니다

[링크 복사]
게시됨 2017. 9. 22. 오후 5:32:59 | | | |
최근에 프로젝트를 진행할 때, 일부 페이지가 많은 데이터를 불러와야 할 때가 있었고, 가끔은 페이지가 로딩이 끝나기를 기다리지 않고 페이지를 클릭한 뒤 다시 다른 페이지를 클릭하기도 했습니다

웹페이지를 로딩하는 동안 매우 느린 정지 상태가 있을 것이니, 오늘은 이를 신중히 살펴보겠습니다.

처음에는 이런 상황이 여러 웹사이트나 컴퓨터 네트워크 속도 문제에서 일어날 줄 알았는데, 이 사이트에는 이런 문제가 없었습니다. 가끔 게시할 때 멈추기도 했지만, 탭 내 다른 페이지를 클릭해 빠르게 로드할 수 있었습니다.

오늘은 좀 더 자세히 살펴보겠습니다!! 먼저 테스트된 코드:

홈뷰 코드:

컨트롤러 코드:



테스트 코드 분석을 위해 컨트롤러는 3가지 메서드가 있는데, 하나는 홈 페이지이고 나머지 2개는 테스트 메서드입니다

Test1 요청은 5초간 차단한 후 사용자에게 데이터를 반환합니다

Test2 요청은 차단되지 않고 데이터를 사용자에게 직접 반환합니다

저희 홈페이지는 Ajax 요청을 위한 두 개의 인터페이스로 구성되어 있는데, 이는 비동기 요청이기 때문에 차단 문제가 없습니다.

Test1 메서드는 Test2가 콘텐츠를 출력한 후에만 콘텐츠를 출력한다는 것을 알게 될 것입니다 (보통 페이지는 Test2가 반환한 내용을 직접 출력한 후, js가 차단하지 않기 때문에 Test1이 반환한 콘텐츠를 출력하기 위해 5초간 기다립니다



그 다음, Test1과 Test2 인터페이스에 직접 접근하는데, 먼저 Test1에 접근한 후 바로 Test2에 접근하면, Test2는 Test1이 돌아올 때까지 기다려야 한다는 것을 알 수 있습니다. 아래 그림에서 볼 수 있습니다:



페이지 요청이 리더 락을 설정하면, 같은 세션에서 동시에 처리되는 다른 요청들은 세션 상태를 업데이트할 수 없지만, 적어도 읽을 수는 있습니다. 만약 어떤 페이지가 세션 상태에 대해 쓰기 잠금을 요청하면, 읽거나 쓰기를 원하든 다른 모든 페이지가 차단됩니다. 예를 들어, 두 프로그램 뷰가 같은 세션에서 동시에 콘텐츠를 작성하고 있다면, 한 프로그램은 다른 프로그램이 완료될 때까지 기다려야 작성할 수 있습니다. AJAX 프로그래밍에서는 이러한 현상을 인지하는 것이 중요합니다.

특별 참고: 세션을 작성할 때만 Asp.net 요청을 차단하지만, 세션이 작성된 페이지를 방문한 경우, 예를 들어 세션이 있는 시스템에 로그인한 후 작업(세션은 만료될 때까지 잠기며, 단지 세션 ID가 동일할 때만 해당됩니다). 이런 문제가 생길 것입니다.

네티즌 정보

웹사이트가 세션을 사용하는 한, 각 요청은 세션 수명 동안 잠기므로 동일한 세션ID를 가진 요청은 잠금 해제를 기다려야 합니다

즉, 웹사이트에 타임아웃 페이지가 있으면 아무것도 할 수 없고, 타임 페이지가 로드될 때까지 기다려야 한다는 뜻입니다.

같은 페이지에 여러 개의 ajax 요청을 동시에 보내는 것도 불가능합니다. 메시지 폴링 요청도 할 수 없습니다.



요약하자면:요청에 세션을 가져가거나 세션을 가져오지 않으면 위 상황은 발생하지 않습니다

용액:

컨트롤러 컨트롤러에 SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly) 기능을 추가했습니다.

메모:

필수란 세션에 대한 독점 잠금(즉, 동일한 세션 ID에 대한 요청을 병렬 처리하지 않음)을 의미합니다.
ReadOnly는 세션에 대해 비독점적 잠금을 요청하는 것을 의미합니다(즉, 독점적 잠금이 있는 요청을 완료하려면 요청이 완료되지만, 비독점적 요청을 처리할 수 있습니다 자물쇠는 병렬로 연결되어 있습니다. 하지만 코드가 세션에 쓰이지 않도록 하는 것은 본인의 몫입니다. 이 규정이 반드시 프레임워크에 의해 강제되는 것은 아닙니다)
필수란 요청한 세션 뮤텍스를 의미합니다(즉, 동일한 세션 ID를 병렬로 처리할 필요가 없음)

ReadOnly는 요청한 세션이 비독점적 잠금(즉, 요청이 완료될 때까지 기다려야 하며, 독점 잠금을 요청하는 경우는 있지만 병렬 비독점적 잠금이 있는 요청을 처리할 수 있음)을 의미합니다. 하지만 코드가 세션을 작성하지 않도록 해야 합니다. 프레임워크에서 실행해야 하는 것은 아닙니다)





이전의:CEF: 클라이언트용 크롬을 임베딩하세요
다음:HTTP 오류 503. 서비스는 이용할 수 없습니다.
게시됨 2018. 7. 6. 오전 11:53:31 |
웹폼의 경우, aspx 상단 페이지 뒤에 추가하세요 (차단 페이지만 불러오세요):

EnableSessionState="ReadOnly"
 집주인| 게시됨 2019. 7. 14. 오후 8:34:17 |
대부분의 웹 개발은 세션을 사용해 세션 상태를 저장하지만, asp.net 애플리케이션에서 세션을 사용하면 웹 애플리케이션 성능에 상당한 영향을 미칠 수 있습니다. 왜 그리고 무엇이 영향을 미칠지 아래에서 분석합니다

MSDN 동시 요청 및 세션 상태에 대한 설명:

동시 요청 및 세션 상태
ASP.NET 세션 상태에 대한 접근은 세션별로 이루어지며, 두 사용자가 동시에 요청을 보낼 경우 각 세션에 대한 접근이 동시에 부여됩니다. 하지만 두 동시 요청이 동일한 세션(동일한 SessionID 값을 사용)이라면, 첫 번째 요청이 세션 정보에 독점적으로 접근할 수 있습니다. 두 번째 요청은 첫 번째 요청이 완료된 후에만 실행됩니다. (만약 첫 번째 요청이 잠금 타임아웃을 초과하여 세션 정보에 대한 독점 잠금이 해제되면, 두 번째 세션도 접근 권한을 얻게 됩니다.) @Page 명령어에서 EnableSessionState 값을 읽기 전용으로 설정하면, 읽기 전용 세션 정보 요청이 세션 데이터에 독점적 잠금이 걸리지 않습니다. 하지만 세션 데이터에 대한 읽기 전용 요청은 세션 데이터가 설정한 읽기/쓰기 요청에서 잠금이 해제될 때까지 기다려야 할 수 있습니다.
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com