2010년 9월 3일 금요일

ASP.NET sessionState SQL Server 설정 및 관리

ASP.NET 에서의 상태(세션)값 관리 모드로는 다음과 같은 것을 제공합니다.

InProc - 이건 작업자 프로세스에 세션을 저장하겠다는 것. 일반적인 방법.
StateServer - 이건, ASP.NET State 서비스인 별도의 프로세스에서 관리하는것.
SQLServer - 요건 DB 레코드에 저장 관리 하겠다는것.

작업자 프로세스가 장애나, 관리목적의 재생이 발생하는 경우 InProc 는 세션값을 잃게 됩니다. 그래서 세션 기반 로그온 상태 관리를 한다면 StateServer 나 SQLServer 가 효과적인데요,,

StateServer 는 간단합니다.
그냥, ASP.NET State Service 서비스 실행하고,. sessionState 를 StateServer 로만 변경해 주면 끝납니다.

SQLServer 의 경우에는, SQL Server 에다가 먼저 Database 를 만들어야 합니다. 생성 스크립느는 버젼별 닷넷 프레임워크가 설치된, C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 폴더에 보면 InstallSqlState.sql 쿼리문을 실행하면 됩니다.

위 쿼리문은, ASPState 라는 DB와, 관련 프로시져, Job 등이 자동 생성됩니다. 삭제는 같은 폴더에 있는 UninstallSqlState.sql 쿼리문 입니다.

실제 세션상태 관리 정보는 tempdb 에 저장을 하므로, SQL Server 가 재시작되면 역시 tempdb 특성상 세션값을 잃게 됩니다. 그래서, 잃지 않게 할려면 ASPState 에 테이블을 생성하여 관리하면 되는데요. 관련 쿼리는 InstallPersistSqlState.sql 입니다.

web.config 에서는 다음과 같은 형식의 노드가 있으면 됩니다.

<sessionState  mode="SQLServer" sqlConnectionString="Password=pwd;Persist Security Info=True;User ID=ASPState;Data Source=xxx.xxx.xxx.xxx"  timeout="60" cookieless="false" />

ASPState 에 dbo 권한을 가지고 있는 계정을 생성후에 실제  웹페이지를 호출하게 되면, 아마도 tempdb 의 ASPStateTempSessions ASPStateTempApplications 두개 테이블에 대한 권한 오류가 날것입니다.

그럴경우, ASPState 계정에 대해서, 위 2개 테이블에 대한 적절한 권한을 주거나 또는 tempdb 에 대해서 data read/write 권한을 설정해 주면 됩니다.

ASPStateTempApplications 는 어떤 웹어플리케이션인지 구분값을 관리하는 테이블이고, ASPStateTempSessions 는 실제 세션값 정보가 저장되어 있는 테이블 입니다.

422619012 /lm/w3svc/1301884030/root

컬럼: SessionId Created Expires LockDate LockDateLocal LockCookie Timeout 
Locked SessionItemShort SessionItemLong Flags

데이터: vzodgrqw511wcr45b1gixmff1930a784 
2010-09-03 04:45:23.930 
2010-09-03 05:45:28.800 
2010-09-03 04:45:28.760 
2010-09-03 13:45:28.760 

60 

0x3C000000010002000000FFFFFFFF0B436F6D70616E794E616D650
C436F6D70616E79456D61696C0B000000220000000109ED959C
EBB984EBA19C01157765626D61737465724068616E6269726F2E636F6DFF 
NULL 
0

만료된 세션을 파기하기 위해서 Job 에는 ASPState_Job_DeleteExpiredSessions 이 등록되어 매 1분마다 체크하여 만료된 세션은 파기 됩니다.

댓글 없음:

댓글 쓰기

HttpClient 에서 비동기 호출시 System.Threading.Tasks.Task 오류

client.PostAsync().Result; 하나 이상의 오류가 발생했습니다., 위치: System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 이 요청을...