WCF-인스턴스 관리
메시지 집합 (클라이언트 요청)을 서비스 인스턴스에 바인딩하기 위해 WCF에서 사용하는 일련의 기술을 인스턴스 관리라고합니다. WCF는 세 가지 유형의 인스턴스 활성화를 지원하며이 장에서 설명합니다.
통화 별 서비스
호출 당 서비스는 WCF의 기본 인스턴스 활성화 모드입니다. 호출 별 서비스에 대해 WCF 서비스를 구성하면 클라이언트 호출 또는 요청이 진행중인 기간 동안 CLR 개체가 만들어집니다. CLR은 Common Language Runtime을 나타내며 WCF에 서비스 인스턴스를 포함합니다.
호출 당 서비스에서 모든 클라이언트 요청은 새로운 전용 서비스 인스턴스를 달성하며 메모리 소비는 다른 유형의 인스턴스 활성화에 비해 적습니다.
호출 당 서비스로 작동 할 WCF 서비스를 나타내려면 InstanceContextMode 속성을 InstanceContextMode.PerCall로 설정해야합니다. InstanceContextMode 속성은 ServiceBehavior 특성에 속합니다. 따라서 통화 별 서비스는 다음과 같이 구성 할 수 있습니다.
[ServiceContract]
interface IMyContract
{...}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract
{...}
여기서 서비스는 IMyContract로 표현됩니다. 다음 그림은 통화 별 서비스 인스턴스 활성화 프로세스를 보여줍니다.
통화 별 서비스 구현
[DataContract]
class Param {....}
[ServiceContract]
interface IMyContract {
[OperationContract]
void MyMethod(Param objectIdentifier);
}
class MyPerCallService : IMyContract, IDisposable {
public void MyMethod(Param objectIdentifier) {
GetState(objectIdentifier);
DoWork();
SaveState(objectIdentifier);
}
void GetState(Param objectIdentifier) {....}
void DoWork() {....}
void SaveState(Param objectIdentifier) {....}
public void Dispose() {....}
}
여기에서 Param은 위의 예를 위해 발명 된 유사 유형 매개 변수입니다.
세션 별 서비스
이 WCF 활성화 모드에서는 비공개 또는 기밀 세션이 두 엔티티, 즉 클라이언트와 특정 서비스 인스턴스간에 유지된다고 말할 수 있습니다. 개인 세션 서비스라고도하는 세션 별 서비스는 각 클라이언트 요청에 전념하고 해당 세션 인식 서비스와 관련된 다른 모든 인스턴스의 자율성을 유지하는 새로운 서비스 인스턴스를 제공합니다.
세션 별 서비스를 시작하려면 InstanceContextMode 속성을 PerSession으로 설정해야합니다. 여기서 서비스 인스턴스는 세션 기간 내내 메모리에 유지됩니다.
활성화 모드는 구성된 서비스가이 전용 서비스 인스턴스 각각에 관련된 비용으로 인해 몇 개 (또는 최대 수백 개) 이외의 추가 미해결 클라이언트를 지원할 수 없기 때문에 확장 성이 떨어집니다.
세션 별 서비스는 다음과 같이 구성 할 수 있습니다.
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract
{...}
세션 별 서비스 프로세스는 다음 그림과 같이 설명 할 수 있습니다.
다음 코드는 비공개 세션 사용을 위해 구성된 계약 및 서비스를 보여줍니다. 출력은 클라이언트에 실제로 전용 서비스 인스턴스가 있음을 나타냅니다.
서비스 코드
[ServiceContract(Session = true)]
interface IMyContract {
[OperationContract]
void MyMethod();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract, IDisposable {
int m_Counter = 0; MyService() {Console.WriteLine("MyService.MyService()"); }
public void MyMethod() {
m_Counter++;
Console.WriteLine("Counter = " + m_Counter);
}
public void Dispose() {
Console.WriteLine("MyService.Dispose()");
}
}
클라이언트 코드
MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod();
proxy.Close();
산출
MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()
싱글 톤 서비스
이 WCF 활성화 모드에서는 서로 독립적 인 모든 클라이언트 요청이 서비스 끝점에 대한 연결에 관계없이 잘 알려진 동일한 단일 인스턴스에 연결됩니다. 싱글 톤 서비스는 호스트가 닫힐 때만 삭제됩니다.
이 서비스는 호스트가 생성 될 때 한 번만 생성됩니다. 호스트에 싱글 톤 인스턴스가 제공되지 않은 경우 서비스는 NULL로 반환됩니다. 활성화 모드는 각 메서드 호출의 작업량이 적고 백그라운드에 보류중인 작업이 없을 때 가장 좋습니다.
이 Singleton 서비스를 시작하려면 InstanceContextMode 속성을 InstanceContextMode.Single로 설정해야합니다.
따라서 Singleton 서비스는 다음과 같이 구성 할 수 있습니다.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : ...
{...}
싱글 톤 서비스의 과정은 다음 그림과 같습니다.
다음 코드는 싱글 톤 인스턴스를 초기화하고 호스팅하는 데 사용됩니다.
서비스 코드
[ServiceContract]
interface IMyContract {
[OperationContract]
void MyMethod( );
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : IMyContract {
int m_Counter = 0;
public int Counter {
get {
return m_Counter;
}
set {
m_Counter = value;
}
}
public void MyMethod( ) {
m_Counter++;
Trace.WriteLine("Counter = " + Counter);
}
}
호스트 코드
MySingleton singleton = new MySingleton( );
singleton.Counter = 42;
ServiceHost host = new ServiceHost(singleton);
host.Open( );
//Do some blocking calls then
host.Close( );
클라이언트 코드
MyContractClient proxy = new MyContractClient( );
proxy.MyMethod( );
proxy.Close( );
산출
Counter = 43