다음을 통해 공유


세션, 인스턴싱 및 동시성

세션은 두 엔드포인트 간에 전송된 모든 메시지의 상관 관계입니다. 인스턴싱 은 사용자 정의 서비스 개체 및 관련 InstanceContext 개체의 수명을 제어하는 것을 말합니다. 동시성은 동시에 실행되는 스레드 수의 제어에 지정된 용어입니다 InstanceContext .

이 항목에서는 이러한 설정, 설정 사용 방법 및 이러한 설정 간의 다양한 상호 작용에 대해 설명합니다.

회의

서비스 계약에서 ServiceContractAttribute.SessionMode 속성을 SessionMode.Required로 설정하는 경우, 해당 계약은 모든 호출(즉, 호출을 지원하는 기본 메시지 교환)이 동일한 대화의 일부가 되어야 한다고 명시합니다. 계약이 세션을 허용하지만 이를 반드시 요구하지 않는 경우, 클라이언트는 세션을 설정하거나 설정하지 않고 연결할 수 있습니다. 세션이 종료된 후 동일한 세션 기반 채널을 통해 메시지가 전송되면 예외가 발생합니다.

WCF 세션에는 다음과 같은 주요 개념적 기능이 있습니다.

  • 호출 애플리케이션에 의해 명시적으로 시작되고 종료됩니다.

  • 세션 중에 배달된 메시지는 수신되는 순서대로 처리됩니다.

  • 세션은 메시지 그룹을 대화로 상호 연관합니다. 상관 관계의 의미는 추상화입니다. 예를 들어 한 세션 기반 채널은 공유 네트워크 연결을 기반으로 메시지의 상관 관계를 지정할 수 있으며 다른 세션 기반 채널은 메시지 본문의 공유 태그를 기반으로 메시지의 상관 관계를 지정할 수 있습니다. 세션에서 파생될 수 있는 기능은 상관 관계의 특성에 따라 달라집니다.

  • WCF 세션과 연결된 일반 데이터 저장소가 없습니다.

ASP.NET 애플리케이션의 System.Web.SessionState.HttpSessionState 클래스와 이 클래스가 제공하는 기능에 익숙한 경우 이러한 종류의 세션과 WCF 세션 간에 다음과 같은 차이점을 알 수 있습니다.

  • ASP.NET 세션은 항상 서버에서 시작됩니다.

  • ASP.NET 세션은 암시적으로 순서가 지정되지 않습니다.

  • ASP.NET 세션은 요청 간에 일반 데이터 스토리지 메커니즘을 제공합니다.

클라이언트 애플리케이션 및 서비스 애플리케이션은 다양한 방식으로 세션과 상호 작용합니다. 클라이언트 애플리케이션은 세션을 시작한 다음 세션 내에서 보낸 메시지를 수신하고 처리합니다. 서비스 애플리케이션은 세션을 확장성 지점으로 사용하여 추가 동작을 추가할 수 있습니다. 이 작업은 사용자 지정 인스턴스 컨텍스트 공급자와 InstanceContext 직접 작업하거나 구현하여 수행됩니다.

인스턴스화 (인스턴스를 생성하거나 사용하는 과정)

인스턴싱 동작은 ServiceBehaviorAttribute.InstanceContextMode 속성을 사용하여 설정되며, 들어오는 메시지에 대한 응답으로 생성되는 InstanceContext를 제어합니다. 기본적으로 각 InstanceContext 개체는 하나의 사용자 정의 서비스 개체와 연결되므로(기본 경우) 속성을 설정 InstanceContextMode 하면 사용자 정의 서비스 개체의 인스턴스화도 제어됩니다. 열거형은 InstanceContextMode 인스턴싱 모드를 정의합니다.

다음과 같은 인스턴싱 모드를 사용할 수 있습니다.

  • PerCall: 각 클라이언트 요청에 대해 새 InstanceContext (따라서 서비스 개체)가 만들어집니다.

  • PerSession InstanceContext : 새(및 따라서 서비스 개체)는 각 새 클라이언트 세션에 대해 만들어지고 해당 세션의 수명 동안 유지 관리됩니다(세션을 지원하는 바인딩 필요).

  • Single: 단일 InstanceContext (따라서 서비스 개체)는 애플리케이션의 수명 동안 모든 클라이언트 요청을 처리합니다.

다음 코드 예제에서는 서비스 클래스에서 명시적으로 설정되는 기본값 InstanceContextModePerSession 을 보여줍니다.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorInstance
{
    ...  
}  

또한 ServiceBehaviorAttribute.InstanceContextMode 속성은 InstanceContext의 릴리스 빈도를 제어하지만, OperationBehaviorAttribute.ReleaseInstanceModeServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete 속성은 서비스 개체가 해제될 시점을 제어합니다.

Well-Known Singleton Services

단일 인스턴스 서비스 개체에 대한 한 가지 변형은 경우에 따라 유용합니다. 서비스 개체를 직접 만들고 해당 개체를 사용하여 서비스 호스트를 만들 수 있습니다. 이렇게 하려면 ServiceBehaviorAttribute.InstanceContextMode 속성을 ServiceBehaviorAttribute.InstanceContextMode 또는 로 설정해야 합니다. 그렇지 않으면 서비스 호스트가 열릴 때 예외가 발생합니다.

ServiceHost(Object, Uri[]) 생성자를 사용하여 이러한 서비스를 만듭니다. 단일 서비스에서 사용할 특정 개체 인스턴스를 제공하려는 경우 사용자 지정 System.ServiceModel.Dispatcher.IInstanceContextInitializer 을 구현하는 대신 사용할 수 있습니다. 서비스 구현 형식을 생성하기 어려운 경우(예: 매개 변수가 없는 공용 생성자를 구현하지 않는 경우) 이 오버로드를 사용할 수 있습니다.

이 생성자에 개체가 제공되면 WCF(Windows Communication Foundation) 인스턴스화 동작과 관련된 일부 기능이 다르게 작동합니다. 예를 들어 단일 개체 인스턴스가 제공될 때 호출 InstanceContext.ReleaseServiceInstance 은 영향을 주지 않습니다. 마찬가지로 다른 인스턴스 릴리스 메커니즘은 무시됩니다. ServiceHost는 모든 작업에서 항상 OperationBehaviorAttribute.ReleaseInstanceMode로 설정된 것처럼 ReleaseInstanceMode.None 속성이 적용된 상태로 동작합니다.

InstanceContext 개체 공유

또한 해당 연결을 직접 수행하여 어떤 세션 채널 또는 호출이 어떤 InstanceContext 개체와 연결되는지 제어할 수 있습니다.

동시성

InstanceContext의 동시성은 한 번에 활성 상태인 스레드 수를 제어하는 것입니다. 이 값은 ServiceBehaviorAttribute.ConcurrencyModeConcurrencyMode 열거형을 사용하여 제어됩니다.

다음 세 가지 동시성 모드를 사용할 수 있습니다.

  • Single: 각 인스턴스 컨텍스트는 인스턴스 컨텍스트에서 한 번에 최대 하나의 스레드 처리 메시지를 가질 수 있습니다. 동일한 인스턴스 컨텍스트를 사용하려는 다른 스레드는 원래 스레드가 인스턴스 컨텍스트를 종료할 때까지 차단해야 합니다.

  • Multiple: 각 서비스 인스턴스에는 여러 스레드가 동시에 메시지를 처리할 수 있습니다. 이 동시성 모드를 사용하려면 서비스 구현이 스레드로부터 안전해야 합니다.

  • Reentrant: 각 서비스 인스턴스는 한 번에 하나의 메시지를 처리하지만 재입력 작업 호출을 허용합니다. 서비스는 WCF 클라이언트 개체를 통해 호출할 때만 이러한 호출을 허용합니다.

비고

둘 이상의 스레드를 안전하게 사용하는 코드를 이해하고 개발하는 것은 성공적으로 작성하기 어려울 수 있습니다. Multiple 또는 Reentrant 값을 사용하기 전에 서비스가 이러한 모드로 올바르게 설계되었는지 확인하십시오. 자세한 내용은 ConcurrencyMode를 참조하세요.

동시성 사용은 인스턴싱 모드와 관련이 있습니다. 인스턴싱에서 PerCall 각 메시지는 새 InstanceContext 메시지로 처리되므로 동시성은 관련이 없으므로 두 개 이상의 스레드가 활성화 InstanceContext되지 않습니다.

다음 코드 예제에서는 ConcurrencyMode 속성을 Multiple로 설정하는 방법을 보여줍니다.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorConcurrency
{
    ...  
}  

InstanceContext 설정과 상호 작용하는 세션

세션과 InstanceContext은 계약의 열거형 값 SessionMode과 채널 및 특정 서비스 객체 간의 연결을 제어하는 서비스 구현의 속성인 ServiceBehaviorAttribute.InstanceContextMode의 조합에 따라 상호 작용합니다.

다음 표에서는 서비스의 속성 값과 ServiceContractAttribute.SessionMode 속성의 ServiceBehaviorAttribute.InstanceContextMode 조합에 따라 들어오는 채널이 세션을 지원하거나 세션을 지원하지 않는 결과를 보여 줍니다.

InstanceContextMode 값 Required Allowed NotAllowed
PerCall - 세션 채널이 있는 동작: 각 호출에 대해 세션 및 InstanceContext가 있습니다.
- 세션 없는 채널의 경우: 예외가 발생합니다.
- 세션 채널이 있는 동작: 각 호출에 대해 세션 및 InstanceContext가 있습니다.
- 세션 없는 채널의 동작: InstanceContext가 각 호출에 대해 사용됩니다.
- 세션 채널이 있는 동작: 예외가 발생됩니다.
- 세션 없는 채널의 동작: InstanceContext가 각 호출에 대해 사용됩니다.
퍼세션 - 세션이 있는 채널의 동작: 각 채널에 대한 세션 및 InstanceContext.
- 세션 없는 채널의 경우: 예외가 발생합니다.
- 세션이 있는 채널의 동작: 각 채널에 대한 세션 및 InstanceContext.
- 세션 없는 채널의 동작: InstanceContext가 각 호출에 대해 사용됩니다.
- 세션 채널이 있는 동작: 예외가 발생됩니다.
- 세션 없는 채널의 동작: InstanceContext가 각 호출에 대해 사용됩니다.
싱글 - 세션 채널 활용 시 동작: 모든 호출을 위한 하나의 세션과 InstanceContext.
- 세션 없는 채널의 경우: 예외가 발생합니다.
- 세션 채널이 있는 동작: 세션 및 InstanceContext 생성되거나 사용자가 지정한 싱글톤에 대한 동작입니다.
- 세션 없는 채널의 동작: 생성된 싱글톤 또는 사용자가 지정한 싱글톤에 대한 InstanceContext 동작입니다.
- 세션 채널이 있는 동작: 예외가 발생됩니다.
- 세션 없는 채널의 동작: 생성된 각 싱글톤 또는 사용자 지정 싱글톤에 대한 InstanceContext입니다.

참고하십시오