asp.net 세션 상태 이해
저자:Eve Cole
업데이트 시간:2009-07-01 16:44:49
1. 세션 상태의 기능
HTTP는 상태 비저장 프로토콜이므로 일련의 요청이 모두 동일한 클라이언트에서 오는지 또는 단일 브라우저 인스턴스가 여전히 페이지나 사이트를 활발하게 보고 있는지 여부를 자동으로 나타내지 않습니다. 그리고 ASP.net에 내장된 세션 상태 기능을 사용하여 다음을 사용할 수 있습니다.
1. 단일 브라우저 클라이언트에서 서버의 논리적 애플리케이션 세션으로 전달되는 요청을 자동으로 식별하고 분류합니다.
2. 여러 브라우저 요청에서 사용할 수 있도록 세션 범위 데이터를 서버에 저장합니다.
3. 애플리케이션 코드에서 처리할 수 있는 적절한 세션 수명 관리 이벤트(Session_OnStart, Session_OnEnd 등)를 발생시킵니다.
2. 세션 상태 식별
세션을 생성할 때 서버는 각 세션에 대해 별도의 ID를 생성합니다. 식별자는 URL에 허용되는 ASCII 문자만 포함하는 120비트 SessionID 문자열로 표시됩니다. SessionID 값은 고유성과 무작위성을 보장하는 알고리즘을 사용하여 생성됩니다. 고유성을 보장하는 목적은 세션이 충돌하지 않도록 하는 것이며, 무작위성을 보장하는 목적은 악의적인 사용자가 새로운 SessionID를 사용하여 기존 세션 수를 계산할 수 없도록 하는 것입니다. 세션ID.
3. 세션 상태를 저장하는 방법
세션 상태를 저장하는 방법에는 세 가지가 있습니다.
1. In-Process 세션 상태 모드(Inproc): 새로운 웹 프로그램을 생성할 때 기본적으로 In-Process 세션 상태 모드가 채택됩니다. 이 모드는 모든 사람이 일반적으로 사용하는 모드이기도 합니다. 이 모드에서는 세션 상태가 ASP.NET 작업자 프로세스에 로컬로 저장되므로 현재까지 in-process 세션 상태 모드가 아마도 가장 빠른 액세스 옵션일 것입니다. 그러나 세션에 더 많은 데이터를 저장할수록 웹 서버가 더 많은 메모리를 소비하므로 잠재적으로 성능 저하 위험이 높아집니다.
2. .NET 상태 서버 모드(StateServer): 세션 상태는 원격 프로세스(예: aspnet_state.exe라는 Windows NT 서비스)에 저장됩니다.
3. SQL 모드(SQLServer): 세션 상태는 SQL Server에서 관리하는 전용 데이터베이스 테이블에 저장됩니다.
.NET 상태 서버 모드와 SQL 모드는 모두 Out-of-Process 세션 모드라고 할 수 있습니다. 데이터를 저장할 때는 데이터를 직렬화하고 외부 저장소에 저장해야 하며, 데이터를 읽을 때는 데이터를 역직렬화하고 복사해야 합니다. 로컬 세션 사전에 연결되었으므로 요청으로 인해 성능이 15%(프로세스 외부)에서 25%(SQL Server)로 저하되었습니다. 이는 대략적인 추정치일 뿐입니다. 그러나 독립 프로세스 스토리지 시나리오에서는 세션 상태가 더 오래 유지되므로 Microsoft® IIS(인터넷 정보 서비스) 및 ASP.NET 오류로부터 보호하므로 애플리케이션이 더욱 강력해집니다. 세션 상태를 애플리케이션에서 분리함으로써 기존 애플리케이션을 웹 팜 및 웹 가든 아키텍처로 보다 쉽게 확장할 수도 있습니다. 또한 세션 상태는 외부 프로세스에 저장되므로 프로세스 루프로 인한 주기적인 데이터 손실 위험이 본질적으로 제거됩니다.
4. 세션 상태 구성
세션 상태 구성은 Web.config 파일의 <sessionState> 섹션을 설정하여 수행됩니다. 다음은 세 가지 세션 상태의 구체적인 구성 방법을 소개합니다.
1. 진행 중 모드
In-Process 모드는 기본 세션 상태 모드입니다. In-Process 모드를 사용하려면 <sessionState> 요소의 모드 특성을 Inproc로 설정합니다.
In-Process 모드에 대한 구성 설정 예는 다음과 같습니다. http://www.downcodes.com
<구성>
<시스템.웹>
<sessionState mode="Inproc"
쿠키가 없음="거짓"
시간 초과="20"/>
</세션상태>
</system.web>
</구성>
2. 상태 서버 모드
상태 서버를 사용하려면 먼저 세션 저장에 사용되는 원격 서버에서 ASP.NET 상태 서비스가 실행되고 있는지 확인해야 합니다. 이 서비스는 ASP.NET 및 Visual Studio .NET과 함께 다음 위치에 설치됩니다.
systemrootMicrosoft.NETFrameworkversionNumberaspnet_state.exe
그런 다음 응용 프로그램의 Web.config 파일에서 <sessionState> 요소의 모드 특성을 StateServer로 설정합니다. 마지막으로 연결 문자열 속성을 tcpip=serverName:portNumber로 설정합니다.
다음은 상태 서버 모드에 대한 구성 설정의 예입니다.
<구성>
<시스템.웹>
<sessionState mode="StateServer"
stateConnectionString="tcpip=dataserver:42424"
쿠키가 없음="거짓"
시간 초과="20"/>
</세션상태>
</system.web>
3. SQL 서버 모드
SQL Server를 사용하려면 먼저 세션 상태가 저장될 SQL Server 컴퓨터에서 InstallSqlState.sql 또는 InstallPersistSqlState.sql을 실행하세요. 두 스크립트 모두 여러 저장 프로시저를 포함하는 ASPState라는 데이터베이스를 만듭니다.
두 스크립트의 차이점은 ASPStateTempApplications 및 ASPStateTempSessions 테이블이 배치되는 위치입니다. InstallSqlState.sql 스크립트는 이러한 테이블을 TempDB 데이터베이스에 추가합니다. 컴퓨터를 다시 시작하면 데이터가 손실됩니다. 대신 InstallPersistSqlState.sql 스크립트는 이러한 테이블을 ASPState 데이터베이스에 추가하므로 컴퓨터를 다시 시작해도 세션 데이터가 보존됩니다.
기본적으로 두 스크립트 파일은 모두 다음 위치에 설치됩니다.
시스템루트Microsoft.NETFramework버전번호
그런 다음 응용 프로그램의 Web.config 파일에서 <sessionState> 요소의 모드 특성을 SQLServer로 설정합니다. 마지막으로 sqlConnectionString 속성을 Integrated Security=SSPI;data source=serverName;으로 설정합니다.
SQL Server 모드에 대한 구성 설정 예는 다음과 같습니다.
<구성>
<시스템.웹>
<sessionState 모드="SQLServer"
sqlConnectionString="통합 보안=SSPI;데이터 소스=데이터 서버;"
쿠키가 없음="거짓"
시간 초과="20"/>
</세션상태>
</system.web>
</구성>
SQL Server 모드에서는 장애 조치 클러스터에서 작동하도록 세션 상태를 구성할 수도 있습니다. 장애 조치 클러스터는 별도의 컴퓨터에 있는 SQL Server 데이터베이스에 세션 데이터를 저장하는 두 개 이상의 동일한 중복 웹 서버입니다. 한 웹 서버에 장애가 발생하면 클러스터의 다른 서버가 해당 작업을 인계받아 세션 데이터 손실 없이 요청을 처리합니다.
장애 조치 클러스터링을 구성하려면 웹 서버의 Web.config 파일에 있는 <machinekey> 요소를 동일한 값으로 설정하십시오.
그런 다음 세션 데이터가 저장된 컴퓨터의 SQL Server 데이터베이스를 가리키도록 웹 서버의 SQL 연결 문자열을 설정합니다.
5. 세션 상태에 대한 액세스
세션 컬렉션을 통해 세션 상태에 직접 액세스할 수 있습니다. 이전 버전의 ASP와의 호환성을 위해 응용 프로그램 개체의 Session.Contents 속성을 통해 세션 상태에 액세스할 수도 있습니다.
다음 예에서는 첫 번째 웹 페이지의 Session 컬렉션에 두 개의 값을 쓴 다음 두 번째 웹 페이지의 Session 컬렉션을 읽는 방법을 보여줍니다. 참고: 여기에서는 페이지 코드가 생략되었습니다.
첫 번째 웹 페이지는 세션 컬렉션에 값을 씁니다.
문자열 = "a"로 희미한 이름
정수형의 희미한 ID = "1"
세션("이름") = 이름
세션("id") = ID
두 번째 웹 페이지는 Session 컬렉션에서 값을 가져옵니다.
문자열 = 세션("이름")으로 희미한 이름
정수형의 희미한 ID = 세션("id")
'세션 상태 컬렉션의 항목 수를 가져옵니다.
i를 정수로 흐리게 표시 = session.count
In-Process 모드에서는 실제 직렬화 및 역직렬화가 발생하지 않으므로 개체는 해당 클래스의 활성 인스턴스로 세션 상태에 저장됩니다.
Out-of-Process 세션 모드에서는 직렬화(Serialization)와 역직렬화(Deserialization)를 사용하므로 상황에 따라 데이터 타입을 변환해야 합니다.
날짜 값을 직렬화하는 경우 날짜는 Int64 유형이어야 합니다.
6. 세션 수명 관리 이벤트
세션 수명 관리 이벤트에는 Session_OnStart 이벤트와 Session_OnEnd 이벤트가 있습니다. Global.asax.VB 파일에서 설정할 수 있습니다.
1. Session_OnStart 이벤트
단일 브라우저 클라이언트가 서버에 연결되면 세션 시작을 표시하는 Session_OnStart 이벤트가 트리거됩니다. 이 이벤트는 세션 시간이 초과되거나 중단되지 않는 한 후속 검색 중에 더 이상 트리거되지 않습니다. Session_OnStart 이벤트는 페이지에 액세스하기 전에 세션 변수가 설정되기 때문에 세션 변수를 설정하기에 가장 좋은 시기입니다.
예: 다음 예는 온라인 사용자 수를 계산하기 위해 일반적으로 사용되는 Session_OnStart 이벤트 코드입니다.
Sub Session_Start(ByVal 송신자 As Object, ByVal e As EventArgs)
'이벤트 발생 시 온라인 접속자 수에 1을 더합니다.
애플리케이션("usercount") = 애플리케이션("usercount") + 1
서브 끝
2. Session_OnEnd 이벤트
Session_OnEnd 이벤트는 세션이 중단되거나 시간 초과될 때 발생하며 이벤트의 끝을 표시합니다. 하지만 이 이벤트는 InProc 모드에서만 지원된다는 점에 유의하세요. Web.config 파일의 <sessionState> 섹션에 있는 timeout 특성을 통해 시간 초과 기간을 지정할 수 있습니다. 사용자가 시간 초과 기간(분 단위) 내에 있는 경우 기본값은 20분입니다.
시계) 웹 페이지를 새로 고치거나 요청하지 않으면 세션이 종료됩니다. Session_OnEnd 이벤트를 사용하여 일부 정리 작업을 수행할 수 있습니다.
예: 다음 예는 온라인 사용자 수를 계산하기 위해 일반적으로 사용되는 Session_OnEnd 이벤트 코드입니다.
Sub Session_End(ByVal 발신자 As Object, ByVal e As EventArgs)
애플리케이션("usercount") = 애플리케이션("usercount") - 1
서브 끝