WCF(Windows Communication Foundation) 애플리케이션에서 세션 은 메시지 그룹을 대화로 연결합니다. WCF 세션은 ASP.NET 애플리케이션에서 사용할 수 있는 세션 개체와 다르며 다른 동작을 지원하며 다양한 방식으로 제어됩니다. 이 항목에서는 WCF 애플리케이션에서 세션이 사용하도록 설정하는 기능 및 이를 사용하는 방법에 대해 설명합니다.
Windows Communication Foundation 애플리케이션의 세션
서비스 계약이 세션이 필요하다고 지정하는 경우 해당 계약은 모든 호출(즉, 호출을 지원하는 기본 메시지 교환)이 동일한 대화의 일부가 되도록 지정합니다. 계약이 세션을 허용하지만 세션이 필요하지 않다고 지정하는 경우 클라이언트는 세션에 연결하여 세션을 설정하거나 세션을 설정하지 않을 수 있습니다. 세션이 종료되고 메시지가 동일한 채널을 통해 전송되면 예외가 발생합니다.
WCF 세션에는 다음과 같은 주요 개념적 기능이 있습니다.
호출 애플리케이션(WCF 클라이언트)에 의해 명시적으로 시작되고 종료됩니다.
세션 중에 배달된 메시지는 수신되는 순서대로 처리됩니다.
세션은 메시지 그룹을 대화로 상호 연관합니다. 다양한 유형의 상관 관계가 가능합니다. 예를 들어 한 세션 기반 채널은 공유 네트워크 연결을 기반으로 메시지의 상관 관계를 지정할 수 있으며 다른 세션 기반 채널은 메시지 본문의 공유 태그를 기반으로 메시지의 상관 관계를 지정할 수 있습니다. 세션에서 파생될 수 있는 기능은 상관 관계의 특성에 따라 달라집니다.
WCF 세션과 연결된 일반 데이터 저장소가 없습니다.
ASP.NET 애플리케이션의 System.Web.SessionState.HttpSessionState 클래스와 이 클래스가 제공하는 기능에 익숙한 경우 이러한 종류의 세션과 WCF 세션 간에 다음과 같은 차이점을 알 수 있습니다.
ASP.NET 세션은 항상 서버에서 시작됩니다.
ASP.NET 세션은 암시적으로 순서가 지정되지 않습니다.
ASP.NET 세션은 요청 간에 일반 데이터 스토리지 메커니즘을 제공합니다.
이 항목에서는 다음을 설명합니다.
서비스 모델 계층에서 세션 기반 바인딩을 사용하는 경우의 기본 실행 동작입니다.
WCF 세션 기반 시스템 제공 바인딩이 제공하는 기능 유형입니다.
세션 요구 사항을 선언하는 계약을 만드는 방법입니다.
세션의 생성 및 종료와 세션과 서비스 인스턴스의 관계를 이해하고 제어하는 방법입니다.
세션을 사용하는 기본 실행 동작
세션을 시작하려는 바인딩을 세션 기반 바인딩이라고 합니다. 서비스 계약은 서비스 계약 인터페이스(또는 클래스)의 속성을 열거형 값 중 ServiceContractAttribute.SessionMode 하나로 설정 System.ServiceModel.SessionMode 하여 세션 기반 바인딩을 요구, 허용 또는 거부하도록 지정합니다. 기본적으로 이 속성의 값은 Allowed클라이언트가 WCF 서비스 구현과 함께 세션 기반 바인딩을 사용하는 경우 서비스가 제공된 세션을 설정하고 사용한다는 것을 의미합니다.
WCF 서비스가 클라이언트 세션을 수락하는 경우 기본적으로 다음 기능이 사용하도록 설정됩니다.
WCF 클라이언트 개체 간의 모든 호출은 동일한 서비스 인스턴스에서 처리됩니다.
다른 세션 기반 바인딩은 추가 기능을 제공합니다.
System-Provided 세션 형식
세션 기반 바인딩은 특정 세션과 서비스 인스턴스의 기본 연결을 지원합니다. 그러나 다른 세션 기반 바인딩은 이전에 설명한 세션 기반 인스턴싱 컨트롤을 사용하도록 설정하는 것 외에도 다양한 기능을 지원합니다.
WCF는 다음과 같은 유형의 세션 기반 애플리케이션 동작을 제공합니다.
보안 System.ServiceModel.Channels.SecurityBindingElement 기반 세션을 지원합니다. 이 세션은 통신의 양쪽 끝이 특정 보안 대화에 합의했습니다. 자세한 내용은 서비스 보안을 참조하세요. 예를 들어 System.ServiceModel.WSHttpBinding 보안 세션과 신뢰할 수 있는 세션 모두에 대한 지원을 포함하는 바인딩은 기본적으로 메시지를 암호화하고 디지털 서명하는 보안 세션만 사용합니다.
바인딩은 System.ServiceModel.NetTcpBinding TCP/IP 기반 세션을 지원하여 모든 메시지가 소켓 수준의 연결과 상호 연결되도록 합니다.
WS-ReliableMessaging 사양을 구현하는 요소는 System.ServiceModel.Channels.ReliableSessionBindingElement 메시지를 순서대로 정확히 한 번 배달하도록 구성할 수 있는 신뢰할 수 있는 세션을 지원하여 대화 중에 메시지가 여러 노드로 이동하는 경우에도 메시지를 수신하도록 합니다. 자세한 내용은 신뢰할 수 있는 세션을 참조하세요.
바인딩은 System.ServiceModel.NetMsmqBinding MSMQ 데이터그램 세션을 제공합니다. 자세한 내용은 WCF의 큐를 참조하세요.
SessionMode 속성을 설정해도 계약에 필요한 세션 유형은 지정되지 않으며, 필요한 세션 유형만 지정합니다.
세션이 필요한 계약 만들기
세션이 필요한 계약을 만들면 서비스 계약이 선언하는 작업 그룹이 모두 동일한 세션 내에서 실행되어야 하며 메시지가 순서대로 전달되어야 한다고 명시되어 있습니다. 서비스 계약에 필요한 세션 지원 수준을 주장하려면, 서비스 계약 인터페이스나 클래스에서 ServiceContractAttribute.SessionMode 속성을 System.ServiceModel.SessionMode 열거형 값으로 설정하여 계약 여부를 명시하십시오.
세션이 필요합니다.
클라이언트가 세션을 설정할 수 있도록 허용합니다.
세션을 금지합니다.
SessionMode 그러나 속성을 설정해도 계약에 필요한 세션 기반 동작의 형식은 지정하지 않습니다. 서비스에서 통신 채널을 생성하는 구성된 바인딩이 세션을 설정하는지, 설정하지 않는지, 또는 설정할 수 있는지 런타임 시 WCF가 확인하도록 지시합니다. 다시 말하지만, 바인딩은 보안, 전송, 신뢰할 수 있는 또는 일부 조합 등 선택한 모든 유형의 세션 기반 동작으로 해당 요구 사항을 충족할 수 있습니다. 정확한 동작은 선택한 값에 System.ServiceModel.SessionMode 따라 달라집니다. 구성된 서비스 바인딩이 값 SessionMode에 맞지 않으면 예외가 발생합니다. 세션을 지원하는 바인딩과 이 바인딩이 생성한 채널은 세션 기반이라고 합니다.
다음 서비스 계약은 모든 작업이 세션 내에서 ICalculatorSession
와 교환되어야 한다고 명시합니다. 메서드를 제외하고 Equals
호출자에게 값을 반환하는 작업은 없습니다. 그러나 메서드는 Equals
매개 변수를 사용하지 않으므로 데이터가 이미 다른 작업에 전달된 세션 내에서 0이 아닌 값만 반환할 수 있습니다. 이 계약은 올바르게 작동하기 위해 세션을 필요로 합니다. 특정 클라이언트와 연결된 세션이 없으면 서비스 인스턴스는 이 클라이언트가 보낸 이전 데이터를 알 수 없습니다.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true)]
void Clear();
[OperationContract(IsOneWay = true)]
void AddTo(double n);
[OperationContract(IsOneWay = true)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true)]
void DivideBy(double n);
[OperationContract]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True)> _
Sub Clear()
<OperationContract(IsOneWay:=True)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub DivideBy(ByVal n As Double)
<OperationContract()> _
Function Equal() As Double
End Interface
서비스에서 세션을 허용하는 경우 클라이언트가 세션을 시작하는 경우 세션이 설정되고 사용됩니다. 그렇지 않으면 세션이 설정되지 않습니다.
세션 및 서비스 인스턴스
WCF에서 기본 인스턴싱 동작을 사용하는 경우 WCF 클라이언트 개체 간의 모든 호출은 동일한 서비스 인스턴스에서 처리됩니다. 따라서 애플리케이션 수준에서 세션을 로컬 호출 동작과 유사한 애플리케이션 동작을 사용하도록 설정하는 것으로 간주할 수 있습니다. 예를 들어 로컬 개체를 만들 때 다음을 수행합니다.
생성자가 호출됩니다.
WCF 클라이언트 개체 참조에 대한 모든 후속 호출은 동일한 개체 인스턴스에서 처리됩니다.
개체 참조가 제거되면 소멸자가 호출됩니다.
세션은 기본 서비스 인스턴스 동작이 사용되는 한 클라이언트와 서비스 간에 유사한 동작을 사용하도록 설정합니다. 서비스 계약에 세션이 필요하거나 지원되는 경우, 하나 이상의 계약 작업에서 IsInitiating 및 IsTerminating 속성을 설정해 세션을 시작하거나 종료하는 것으로 표시할 수 있습니다.
시작 작업은 새 세션의 첫 번째 작업으로 호출해야 하는 작업입니다. 시작되지 않는 작업은 하나 이상의 시작 작업이 호출된 후에만 호출할 수 있습니다. 따라서 서비스 인스턴스의 시작에 적합한 클라이언트의 입력을 받도록 설계된 시작 작업을 선언하여 서비스에 대한 일종의 세션 생성자를 만들 수 있습니다. (상태는 서비스 개체가 아니라 세션과 연결됩니다.)
반대로 종료 작업은 기존 세션의 마지막 메시지로 호출해야 하는 작업입니다. 기본 사례에서 WCF는 서비스가 연결된 세션이 닫힌 후 서비스 개체와 해당 컨텍스트를 재활용합니다. 따라서 서비스 인스턴스의 끝에 적합한 함수를 수행하도록 설계된 종료 작업을 선언하여 일종의 소멸자를 만들 수 있습니다.
비고
기본 동작은 로컬 생성자 및 소멸자와 유사하지만, 단지 외견상 비슷할 뿐입니다. 모든 WCF 서비스 작업은 시작 또는 종료 작업이거나 동시에 둘 다일 수 있습니다. 또한 기본 사례에서 시작 작업은 순서에 따라 여러 번 호출할 수 있습니다. 개체를 조작하여 서비스 인스턴스의 수명을 명시적으로 제어하지 않는 한 세션이 설정되고 인스턴스와 연결되면 추가 세션이 System.ServiceModel.InstanceContext 만들어지지 않습니다. 마지막으로 상태는 서비스 개체가 아닌 세션과 연결됩니다.
예를 들어 ICalculatorSession
이전 예제에서 사용된 계약을 사용하려면 WCF 클라이언트 개체가 먼저 다른 작업 전에 작업을 호출 Clear
하고 이 WCF 클라이언트 개체가 있는 세션이 작업을 호출 Equals
할 때 종료되어야 합니다. 다음 코드 예제에서는 이러한 요구 사항을 적용하는 계약을 보여 줍니다.
Clear
는 세션을 시작하기 위해 먼저 호출되어야 하며 해당 세션은 호출될 때 Equals
종료됩니다.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
void Clear();
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void AddTo(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void DivideBy(double n);
[OperationContract(IsInitiating = false, IsTerminating = true)]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True, IsInitiating:=True, IsTerminating:=False)> _
Sub Clear()
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub DivideBy(ByVal n As Double)
<OperationContract(IsInitiating:=False, IsTerminating:=True)> _
Function Equal() As Double
End Interface
서비스는 클라이언트와 세션을 시작하지 않습니다. WCF 클라이언트 애플리케이션에서는 세션 기반 채널의 수명과 세션 자체의 수명 사이에 직접 관계가 존재합니다. 따라서 클라이언트는 새 세션 기반 채널을 만들어 새 세션을 만들고 세션 기반 채널을 정상적으로 닫아 기존 세션을 중단합니다. 클라이언트는 다음 중 하나를 호출하여 서비스 엔드포인트로 세션을 시작합니다.
ICommunicationObject.Open에 대한 호출로 반환된 채널의 ChannelFactory<TChannel>.CreateChannel에서
ClientBase<TChannel>.Open ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)에 의해 생성된 WCF 클라이언트 개체에서
두 유형의 WCF 클라이언트 개체에 대한 시작 작업입니다(기본적으로 모든 작업이 시작됨). 첫 번째 작업이 호출되면 WCF 클라이언트 개체가 자동으로 채널을 열고 세션을 시작합니다.
일반적으로 클라이언트는 다음 중 하나를 호출하여 서비스 엔드포인트로 세션을 종료합니다.
ICommunicationObject.Close에 대한 호출로 반환된 채널의 ChannelFactory<TChannel>.CreateChannel에서
ClientBase<TChannel>.Close Svcutil.exe에 의해 생성된 WCF 클라이언트 개체에 대한 것입니다.
두 유형의 WCF 클라이언트 개체에 대한 종료 작업입니다(기본적으로 종료되는 작업은 없습니다. 계약은 종료 작업을 명시적으로 지정해야 합니다). 첫 번째 작업이 호출되면 WCF 클라이언트 개체가 자동으로 채널을 열고 세션을 시작합니다.
예를 들어 방법 : 세션이 필요한 서비스 만들기 및 기본 서비스 동작 및 인스턴싱 샘플을 참조하세요.
클라이언트 및 세션에 대한 자세한 내용은 WCF 클라이언트를 사용하여 서비스에 액세스하는 것을 참조하세요.
InstanceContext 설정과 상호 작용하는 세션
계약의 SessionMode 열거형과 채널 및 특정 서비스 개체 간의 연결을 제어하는 ServiceBehaviorAttribute.InstanceContextMode 속성 사이에 상호 작용이 있습니다. 자세한 내용은 세션, 인스턴싱 및 동시성을 참조하세요.
InstanceContext 개체 공유
또한 해당 연결을 직접 수행하여 어떤 세션 기반 채널 또는 호출이 어떤 InstanceContext 개체와 연결되는지 제어할 수 있습니다.
세션 및 스트리밍
전송할 데이터가 많은 경우 WCF의 스트리밍 전송 모드는 메모리 전체에서 메시지를 버퍼링하고 처리하는 기본 동작 대신 사용할 수 있는 대안입니다. 세션 기반 바인딩을 사용하여 호출을 스트리밍할 때 예기치 않은 동작이 발생할 수 있습니다. 모든 스트리밍 호출은 사용 중인 바인딩이 세션을 사용하도록 구성된 경우에도 세션을 지원하지 않는 단일 채널(데이터그램 채널)을 통해 수행됩니다. 여러 클라이언트가 세션 기반 바인딩을 통해 동일한 서비스 개체에 대한 스트리밍 호출을 수행하고 서비스 개체의 동시성 모드가 단일 모드로 설정되고 인스턴스 컨텍스트 모드가 설정된 PerSession
경우 모든 호출은 데이터그램 채널을 통과해야 하므로 한 번에 하나의 호출만 처리됩니다. 그러면 하나 이상의 클라이언트가 시간 초과할 수 있습니다. 이 문제를 해결하려면 서비스 개체의 InstanceContextMode
를 PerCall
로 설정하거나 동시성을 여러 개로 설정하십시오.
비고
MaxConcurrentSessions는 사용할 수 있는 "세션"이 하나뿐이므로 이 경우 적용되지 않습니다.