재우니의 블로그

Session in ASP.Net Webform - 강좌2

 

 

목차

  • 세션 모드 및 상태 제공자
    • 세션 상태
    • 세션 이벤트
    • 세션 모드
      • InProc 세션 모드
        • InProc 세션 모드 개요
        • 언제 InProc 세션 모드를 사용해야 합니까?
        • 장점과 단점
      • StateServer 세션 모드
        • StateServer 세션 모드 개요
        • StateServer 세션 모드 구성
        • StateServer 세션 모드 작동 방식
        • StateServer 세션 모드의 예
        • 장점과 단점

 

 

Session Mode  와 State Provider

 

 

ASP.NET 에서 아래와 같은 세션 MODE 를 제공해 줍니다.

 

  • InProc
  • StateServer
  • SQLServer
  • Custom

 

 

모든 세션 상태에 대해 Session 제공자가 있습니다. 아래와 같은 다이어그램은 이들이 어떻게 연관되어 있는지 보여줄것입니다.

Fig : Session State 아키텍쳐

 

 

 

 

우리는 session state 제공자를 선택한 session state 를 기반으로 session state 제공자를 선택할 수 있습니다.

ASP.NET 은 SESSON ID 기반인 어떤 정보를 요청할때, 세션 상태 그리고 이와 일치한 제공자는 사용자를 기반으로 한 적합한 정보를 보내는데 책임을 가지고 있습니다.  아래의 테이블을 보면 Session Mode 에 대한 제공자 이름이 있습니다.

 

 

Session State Mode State Provider
InProc In-Memory Object
StateServer Aspnet_state.exe
SQLServer DataBase
Custom CustomProvider

 

 

 

이것들 이외에 또 다른 모드인 "Off" 가 있습니다. 만약에 세션에서 이 기능을 선택하면, 모든 어플리케이션에서 모든 페이지를 사용할 수 없게 됩니다. 그러나 우리의 목적은 세션을 사용하는 것이며, 그래서 우리는 4가지의 Session State Mode 를 살펴보고 있습니다.

 

 

 

Session States 

 

만약에 session state 에 대해 고려한다면, 이는 웹어플리케이션에 어울리는 모든 설정을 의미합니다. Session State, 이는 자체적으로 봐도 매우 큰 부분이며, 이는 세션 환경에 대한 모든것을 말합니다. web.config 뿐만 아니라 코드 바하인드까지 말이죠. web.config 에서 <SessionState> 요소로 session 환경 설정을 사용합니다. 또다른 Mode 가 있는데, Timeout, StateConnecionString, Custom provider 등이 있습니다. connection 문자열 부분에 대한 각각에 대해 말해볼까 합니다.

Session Mode 를 설명하기 전에 Session Event 를 살펴볼 까 합니다.

 

 

Session Event  

 

ASP.NET 에 가능한 SESSION EVENT 의 2개 형식이 있습니다. 

  • Session_Start
  • Session_End

 

 

어플리케이션의 global.asax 파일에서 해당 이벤트 둘다 핸들링 할 수 있습니다. 새로운 세션은 session_start 이벤트 발생되어 초기화 되며, Session_End 이벤트 발생으로 세션이 해제 및 만료가 됩니다..

 
  void Session_Start(object sender, EventArgs e) 
    {
        // Code that runs when a new session is started

    }

    void Session_End(object sender, EventArgs e) 
    {
        // Code that runs when a session ends. 
 
    }

 

 


 

 

 

 

 

 

 

세션모드에는 총 4가지가 존재합니다. InProc, StateServer, Sql Server, Custom Session 이렇게 존재합니다.

하나씩 알아가보도록 하죠.

 

 

Session Mode 

 

ASP.NET 에서 SESSION MODE 에 대하여 이미 이야기를 하였지만, ASP.NET SESSION 에서 아래와 같은 다른 TYPE 의 MODE 들이 있습니다.

  • Off
  • InProc
  • StateServer
  • SQLServer
  • Custom

 

만약에 Mode = "off" 가 web.config 에 설정되이 있으면, session 은 모든 어플리케이션에서 사용할 수 없습니다. 기술하게 되면...

 

 

 

 

 

 

 

InPorc Session Mode : 

 

ASP.NET 에서 이는 기본 SESSION MODE 입니다. 이는 SESSION 정보가 Application Domain 에 저장되어 있습니다. 이는 ASP.NET 어플리케이션 성능상 기본이 되는 최상의 SESSION MODE 입니다.

대신이 이에 대한 단점이 있습니다. 이는 만약에 SERVER 가 재시작을 하게 되면 데이터를 잃어버리게 된다는 것입니다. InProc 세션 mode 에 대한 약간의 장단점이 있습니다. 다시 이러한 요점을 다시 이야기할 까 합니다.

 

 

InProc Session Mode 설명

 

 

InProc Mode session 데이터는 이전에 말씀 드렸듯이 Application Domain 에 저장이 됩니다. 그래서 매우 유용합니다.

 

 

 

 

 

그래서 InProc 세션 모드는 Application Domain 에서 memory 객체에 session 데이터를 저장합니다. 이는 application pool 에서 worker process 에 의해 핸들링 됩니다. 그래서 만약에 server 가 재시작하게 되면, session 데이터를 잃어 버리게 될것입니다. 만약에 클라이언트가 데이터를 요청하면, state provider 가 in-memory 에서 데이터를 읽고 이를 클라이언트에 반환해 줍니다. web.config 에서 session mode 를 설정하며, 여기에 Timeout 을 설정할 수 있습니다.

 

 

 

 

 

해당 Session TimeOut 설정을 30초로 활성화 하였습니다. 이 또한 Code Behind 단 에서 설정을 할 수도 있습니다.

 
Session.TimeOut=30; 

 

 

ASP.NET 의 Session 이벤트에는 두 가지 타입이 있습니다. 여기에는 Session_Start() 그리고 Session_End() 가 존재합니다. 이는 오직 Session_End() 이벤트를 제공하는 유일한 모드는 'InProc Mode session'  뿐입니다. 만약  session 이 timeout 시점이 넘게 되면 Session_End() 를 호출하게 됩니다. InProc Session State 에 대한 일반적인  flow 는 아래와 같습니다.

 

 

 

 

 

지금 Session_End() 메소드가 호출될때, 이는 Session 의 TimeOut 에 의존합니다. 이는 매우 빠른 매카니즘입니다. 왜냐면 어떤 직렬화에 대한 발생도 없으며, data 는 동일한 application domain 에서 머무를 것입니다.

 

 

 

InProc Session Mode 는 언제 사용해야 할까? 

 

 

InProc Session Mode 는 ASP.NET 의 기본 SESSION MODE 입니다. 이는 작은 웹사이트를 운영 및 사용자가 매우 적을시에 매우 도움이 될것입니다. Web Garden 의 경우 InProc 는 피해야 합니다. (이 부분에 대해서는 차후에 말씀드릴 예정)

 

 

장단점에 대해 알아보자

 

 

장점 :

 

  • 현재 application domain 의 메모리 객체에 세션 데이터를 저장합니다. 그래서 데이트를 접근하는데 매우 빠릅니다.
  • InProc 세션 Mode 에서 데이터를 저장하기 위해 직렬화를 요구하지 않습니다. 
  • 구현하기 매우 쉬우며, View State 와 비슷합니다.

 

 

단점:

 

 

InProc Session 은 매우 빠르며, 공통이고 기본 매카니즘입니다. 그리고 만약 제약사항이 있습니다.

 

 

  • 작업프로세스 또는 application domain 재가동시 모든 세션데이터가 사라집니다.
  • 매우 빠를지라도, 매우 많은 세션 데이터 그리고 사용자로 인해 성능에 대한 영향을 받을 수 있습니다.
  • Web Garden 시나리오를 사용할 수 없습니다.
  • 세션 모드는 Web Garden 시나리오 또한 적합하지 않습니다.

 

위의 논의에 따라 InProc은 매우 빠른 세션 저장 메커니즘이지만 소규모 웹 애플리케이션에만 적합하다는 결론을 내릴 수 있습니다. 서버를 다시 시작하거나 애플리케이션 도메인이 recycled(재활용)되면 InProc 세션 데이터가 손실됩니다. 또한 Web Farm 이나 Web Garden 시나리오에 적합하지 않습니다.

 

이제 이러한 문제를 극복하기 위해 사용할 수 있는 다른 옵션을 살펴보겠습니다.

먼저 StateServer 모드가 있습니다.

 

 

 


 

 

 

 

 

✅✅✅✅  여기서 중요!! StateServer 알아두면 좋으므로 집중하자 !! ✅✅✅✅

 

StateServer Session Mode

 

StateServer Session Mode 알아보기 :

 

 

StateServer Session mode 는 out-Proc 라고 불리우며, stand-alone 윈도우서비스를 사용합니다. 이는 iis 의 독립적이며, 분리된 서버에서 운영할 수 있습니다. 이 session state 는 전체적으로 aspnet_state.exe 파일에 의해 관리됩니다.

이 서버는 동일한 시스템상에서 운영합니다. 그러나 이는 웹 어플리케이션이 실행할 주요 application domain 의 바깥쪽에 있습니다. 만약에 asp.net 프로세스를 재시작해도 웹어플리케이션은 살아있습니다. 이러한 접근은 직렬화 및 역직렬화에 대한 오버해드로 인해 여러가지 단점을 가지고 있습니다. 또한 데이터 접근하는 비용이 또한 점차 증가됩니다.

 

 

이를 Out-Proc 세션 모드라고도 합니다. StateServer는 IIS와 독립적이며 별도의 서버에서도 실행할 수 있는 독립 실행형 Windows 서비스를 사용합니다. 이 세션 상태는 전적으로 aspnet_state.exe에서 관리합니다. 이 서버는 동일한 시스템에서 실행될 수 있지만 웹 애플리케이션이 실행되는 기본 애플리케이션 도메인 외부에 있습니다. 즉, ASP.NET 프로세스를 다시 시작하면 세션 데이터가 계속 유지됩니다. 이 접근 방식은 관련된 직렬화 및 역직렬화(serialization and de-serialization) 의 오버헤드로 인해 몇 가지 단점이 있으며 사용자가 세션 데이터를 검색할 때마다 응용 프로그램이 다른 프로세스를 참조해야 하기 때문에 데이터 액세스 비용도 증가합니다. (오버헤드 및 비용 증가)

 

 

 

 

 

StateServer Session Mode 의 환경설정(Configuration )

 

 

StateServer 모드에서 세션 데이터는 IIS와 독립적인 별도의 서버에 저장되며aspnet_state.exe에 의해 처리됩니다 .이 프로세스는 Windows 서비스로 실행됩니다.Windows MMC 또는 명령 프롬프트에서 이 서비스를 시작할 수 있습니다.  (ASP.NET State Service 서비스)

 

 

 

시작 유형을 Automatic(자동) 으로 변경하여 설정합니다. (기본은 수동임)

 

 

명령 프롬프트에서 "net start aspnet_state"를 입력하기만 하면 됩니다. 기본적으로 이 서비스는 TCP 포트 42424를 수신하지만 아래 그림과 같이 레지스트리 편집기에서 포트를 변경할 수 있습니다.

 

 

이제 StateServer 설정에 대한 web.config 구성을 살펴보죠. State Server 설정에 대해서 stateConnectionString 을 기술해야 합니다. 이는 ASP.NET State Server  를 실행 중인 시스템을 식별합니다. 기본적으로 stateConnectionString 은 IP 127.0.0.1(localhost) 및 포트 42424를 사용했습니다.

 

 



 

timeout 속성은 사용자가 웹 서버에 대한 연결을 유지할 수 있는 시간(분단위)입니다. 기본은  20분 입니다.

stateNetworkTimeout은 웹서버와 stateserver 간의 연결이 유휴 상태일 수 있는 시간(초단위)입니다. 기본값은 10초입니다.

 

<sessionState mode="StateServer" 
    stateConnectionString="tcpip=127.0.0.1:42424"  
    stateNetworkTimeout="10" 
    timeout="20"  
    compressionEnabled="true" />

 

 

 

동일한 PC에서 실행되는 StateServer의 경우 IP 주소 127.0.0.1 또는 localhost를 사용할 수 있다는 점에 유의해야 합니다. 외부 서버의 경우 필요한 IP 주소와 포트를 지정합니다. 또한 StateServer 호스팅 서버의 모든 방화벽에 대해 포트가 열려 있는지 확인해야 합니다. StateServer 에 액세스하기 위해 원격 웹 서버에 대한 액세스를 허용하려면 아래와 같이 레지스트리 설정이 값 1로 설정되어 있는지 확인해야 합니다.
 

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters  위치에서 AllowRemoteConnection 의 기본값(0) 을 1로 치환합니다. 이는 원격지 연결을 허용해 주는것을 의미합니다. 외부 웹서버로 부터 StateServer 를 사용하고자 할 경우, 연결자를 통해 접근 시 원격지 연결 허용을 해서 사용할수 있도록 해줍니다.

 

참고로 아래 Port 는 기본값(42424) 이며, StateServer 의 포트를 변경하고자 할 경우 변경 선택해서 값을 수정해 주면 됩니다. 포트 연결이 잘 되는지 telnet 명령어를 통해 검증을 하면 됩니다.

 

StateServer를 사용하려면 저장하려는 객체를 직렬화해야 하고 검색할 때 역직렬화해야 합니다. 아래에 예를 들어 설명했습니다.

 

StateServer는 또한 모든 웹 서버가 동일한 machineKey 값을 사용하도록 요구합니다. machineKey는 ViewState를 해독하는 데 사용되며 들어오는 데이터가 웹 서버 간에 번갈아 가면서 forms authentication cookie 를 형성합니다. 예를 들어 web.config에서 자동으로 생성된 다음, machinekey 는 다음과 같이 static key 로 대체되어야 합니다.

 

 

기존 : generated machine key 

<machineKey validationKey="AutoGenerate,IsolateApps" 
    decryptionKey="AutoGenerate,IsolateApps" 
    validation="SHA1"/>

 

현재 : static key 로 대체

<system.web>
	<machineKey 
    	validationKey='546BDC5ACBB3FF06721773CE3414AD26F9DE00A2188A3E03403115CF96FA85C78CA6808C02714B27E7DEFBFBAC1A49DACF722608953E1CEA407C21DB330EECE2'   
        decryptionKey='5C24B005CF68E6536FCE8040BFD79C27716AFB3620DF19E5'   
        validation='SHA1'/>
</system.web>

생성사이트 : http://www.eggheadcafe.com/articles/GenerateMachineKey/GenerateMachineKey.aspx

 

 

 

 

StateServer Session Mode 는 어떻게 작동하는거죠?

 

웹 서버를 다시 시작할 때 불필요한 세션 데이터 손실을 방지하기 위해 StateServer 세션 모드를 사용합니다. StateServer는 aspnet_state.exe 프로세스에 의해 Windows 서비스로 유지됩니다. 이 프로세스는 모든 세션 데이터를 유지합니다. 그러나 StateServer 세션 모드에 데이터를 저장하기 전에 데이터를 직렬화해야 합니다.

 

 

 

 

 

 

위의 그림과 같이 클라이언트가 웹 서버에 요청을 보내면 웹 서버는 세션 데이터를 StateServer 에 저장합니다. StateServer는 현재 시스템이거나 다른 시스템일 수 있습니다. 그러나 IIS와는 완전히 독립적입니다. StateServer의 대상은 web.config stateConnectionString 설정에 따라 달라집니다. 127.0.0.1:42424로 설정하면 로컬 시스템 자체에 데이터가 저장됩니다. StateServer 대상을 변경하려면 IP를 변경하고 aspnet_state.exe가 해당 시스템에서 실행 중인지 확인해야 합니다. 그렇지 않으면 세션에 데이터를 저장하려고 시도하는 동안 다음 예외가 발생합니다.

 

 

 

 

세션에 개체를 저장할 때 직렬화해야 합니다. 해당 데이터는 State Provider를 사용하여 StateServer 시스템에 저장됩니다. 그리고 데이터를 검색할 때 State Provider는 데이터를 반환합니다. 전체 흐름은 아래 그림에 나와 있습니다.

 

 

 

 

 

 

 

StateServer Session Mode 를 활용한 예제: 

 

다음은 StateServer 세션 모드를 사용하는 간단한 예입니다. 사용법을 쉽게 이해할 수 있도록 IIS에서 직접 이 샘플 웹 응용 프로그램을 만들었습니다.

 

 

1단계: Visual Studio > 파일 > 새로 만들기 > 웹 사이트를 엽니다. 위치를 HTTP로 선택하고 웹 애플리케이션을 생성합니다.

 

 

 

 

이제 IIS를 열면 웹 응용 프로그램의 이름으로 생성된 가상 디렉터리를 볼 수 있습니다. 제 경우에는 StateServer입니다.

 

 

 

 

 

 

 

2단계: roll  번호와 학생 이름을 사용하는 간단한 UI를 만듭니다. state server session 에 이름과 roll  번호를 저장합니다. 또한 StudentInfo 클래스를 만들었습니다. 이 클래스는 다음과 같습니다. 여기서 중요한 부분은 클래스에서 어트리뷰트에 [Serializable] 를 지정하여 "직렬화" 한 부분입니다. 

 

 
[Serializable]
public class StudentInfo
{
    //Default Constructor
    public StudentInfo()
    {
       
    }
    /// <summary>
    /// Create object of student Class
    /// </summary>
    /// <param name="intRoll">Int RollNumber</param>
    /// <param name="strName">String Name</param>
    public StudentInfo(int intRoll, string strName)
    {
        this.Roll = intRoll;
        this.Name = strName;
    }

    private int intRoll;
    private string strName;
    public int Roll
    {
        get
        {
            return intRoll;
        }
        set
        {
            intRoll = value;
        }
    }

    public string Name
    {
        get
        {
            return strName;
        }
        set
        {
            strName = value;
        }
    }
}

 

 

이제 코드 비하인드 코드를 보면, 두 개의 버튼을 추가했습니다. 하나는 세션 저장용이고 다른 하나는 세션 검색용입니다.

 

 
protected void btnSubmit_Click(object sender, EventArgs e)
{
    StudentInfo _objStudentInfo = 
      new StudentInfo(Int32.Parse( txtRoll.Text) ,txtUserName.Text);
    Session["objStudentInfo"] = _objStudentInfo;
    ResetField();
}
protected void btnRestore_Click(object sender, EventArgs e)
{
    StudentInfo _objStudentInfo = (StudentInfo) Session["objStudentInfo"];
    txtRoll.Text = _objStudentInfo.Roll.ToString();
    txtUserName.Text = _objStudentInfo.Name;
}

 

 

3단계: 이미 설명한 대로 ASP.NET State Server 에 대한 web.config 를 구성합니다. 그리고 구성된 서버에서 aspnet_state.exe가 실행 중인지 확인하세요.

 

 

 

Step 4 : 어플리케이션을 실행합니다.

 

 

데이터를 입력하고, Submit 버튼을 선택합니다.

 

ASP.NET State Server 가 정확히 얼마나 유용한지 완전히 설명하는 다음과 같은 테스트가 있습니다.

 

 

 

1단계, 제대로 검증하기 위해, StudentInfo 클래스에서 [Serializable ] 키워드를 제거하고 응용 프로그램을 실행해 봅니다. Submit 버튼을 클릭하면 다음과 같은 오류가 발생합니다.

 

 

 

 

 

세션에 개체를 저장하기 전에 [Serializable ] 직렬화해야 한다는 것이 명확해 졌습니다. ^^  

 

 

 

2단계: 어플리케이션을 실행하고, 애플리케이션을 실행하고 데이터를 저장합니다. IIS를 다시 시작하십시오.

 

 

 

 

 

InProc의 경우 이미 세션 데이터가 손실되었지만 StateServer의 경우 Restore Session 버튼을 클릭하면 StateServer 데이터가 IIS에 의존하지 않기 때문에 원래 데이터를 얻을 수 있습니다. 즉, 따로 보관하고 있습니다.

 

 

3단계: Windows 서비스 MMC에서 ASP.NET State Server 즉, aspnet_state.exe를 중지하고 데이터를 submit 합니다. 다음과 같은 오류가 발생합니다.

 

 

 

 

 

ASP.NET State Server 프로세스가 실행되고 있지 않기 때문입니다. 따라서 State Server Mode 를 사용할 때 위의 세 가지 사항을 명심해야 합니다.

 

 

 

그래서.. 장단점을 알아보자.

 

 

그래서 위의 내용을 기반으로...

 

 

장점  :

  • iis 로 부터 데이터 분리를 할 수 있으며, iis 로 인해 session 데이터의 피해를 주지 않습니다. (iis 독립화)
  • webfarm 에 대한 유용한 시나리로를 사용할 수 있습니다. (확장성 좋음)

 

 

단점 :

  • 프로세스는 직렬화 및 역직렬화로 인해 느려질 수 있습니다.(성능이슈)
  • State Server 는 항상 활성화 되어 있어야 하며, 운영중이어야 합니다. (비용발생)

 

 

ASP.NET State Server 설명이 이제 끝났습니다.

 

다음 강의에서 여러분은 LoadBalance, Web farm, Web Garden 시나리오 상에 약간의 흥미로운 부분을 발견하실 겁니다. 

 

 

 

🎈🎈📢📢📢 Session in ASP.Net webform - 강좌1 바로가기

🎈🎈📢📢📢 Session in ASP.Net webform - 강좌2 바로가기

🎈🎈📢📢📢 Session in ASP.Net webform - 강좌3 바로가기

🎈🎈📢📢📢 Session in ASP.Net webform - 강좌4 바로가기

 

 

 

StateServer 환경 구축 후 간단히 샘플 페이지 만든 소스 (asp.net mvc 5 기준)

 

StateSeverWeb.zip
0.74MB

 

 

번역 출처:

https://learn.microsoft.com/en-us/previous-versions/aspnet/ms178586(v=vs.100) 

 

Session-State Modes

Table of contents Session-State Modes Article 10/22/2014 9 minutes to read In this article --> ASP.NET session state supports several different storage options for session data. Each option is identified by a value in the SessionStateMode enumeration. The

learn.microsoft.com

 

https://www.primaryobjects.com/2010/12/05/web-gardens-web-farms-clouds-and-session-state-in-c-asp-net/

 

Web Gardens, Web Farms, Clouds, and Session State in C# ASP .NET

Web Gardens, Web Farms, Clouds, and Session State in C# ASP .NET

www.primaryobjects.com

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=crossbow71&logNo=60130581086 

 

.NET Framework 4.0에서 세션 처리 하기 (StateServer 이용)

SQL Server를 이용한 세션 처리 방법이 부담스럽다면... 윈도우의 서비스 중에 ASP.NET St...

blog.naver.com

 

 

https://blog.naver.com/crossbow71/60122354586

 

.NET Framework 4.0에서 세션 처리 하기 (SQLServer 이용)

기존엔 c:\Windows\Microsoft.Net\Framework\버전 하위에 있는 설치 스크립트 sql 파일을 이용해 ...

blog.naver.com