이 샘플에서는 영속 서비스에서 작동하는 지속성 공급자를 만드는 방법을 보여 줍니다. 서비스 인스턴스의 상태는 컴퓨터의 파일에 저장됩니다.
이 샘플에는 영속 서비스과 동일한 계산기 서비스 구현도 포함되어 있습니다. 그러나 이 서비스에서는 표준 잠금 SQL 지속성 공급자를 사용하지 않고 샘플에서 만든 파일 지속성 공급자를 사용한다는 점에서 다릅니다.
참고
이 샘플을 빌드하고 실행하려면 .NET Framework 버전 3.5를 설치해야 하고, 프로젝트 및 솔루션 파일을 열려면 Visual Studio 2008이 필요합니다.
Calculator Client 샘플은 이 서비스에서 실행해야 합니다. 자세한 내용은 이 항목의 끝에 나오는 설치 절차를 참조하십시오.
파일 지속성 공급자
이 샘플의 파일 지속성 공급자는 FilePersistenceProviderFactory.cs 파일에 정의됩니다. 실제 FilePersistenceProvider 클래스는 포함된 클래스에 있습니다. 파일 지속성 공급자를 만들기 위해 필요에 따라 팩터리에서 실제 지속성 공급자 클래스를 서비스 런타임으로 전달하는 팩터리 패턴을 사용합니다. 이 방법은 WCF에서 공급자를 만드는 표준 방법입니다.
파일 지속성 공급자 팩터리 클래스는 PersistenceProviderFactory 추상 클래스에서 상속됩니다. PersistenceProviderFactory 추상 클래스는 다음 코드에서 정의됩니다.
namespace System.ServiceModel.Persistence
{
public abstract class PersistenceProviderFactory : CommunicationObject
{
protected PersistenceProviderFactory();
public abstract PersistenceProvider CreateProvider(Guid id);
}
}
PersistenceProviderFactory는 CommunicationObject 추상 클래스에서 상속됩니다. CommunicationObject는 서비스 런타임에서 사용될 때 개체의 수명을 관리하는 데 필요한 메서드를 제공합니다.
공급자에 대한 팩터리 패턴을 사용하면 팩터리에서 모든 공급자 인스턴스에 공통되는 리소스를 관리할 수 있습니다. 예를 들어 파일 지속성 공급자의 경우 지속성 파일이 저장된 후 실제 파일 지속성 공급자의 모든 인스턴스에서 공유되는 위치를 팩터리에서 결정할 수 있습니다.
따라서 모든 서비스 인스턴스에 대해 하나의 공급자 인스턴스가 존재하게 됩니다. 또한 각 호스트에 대해 하나의 팩터리 인스턴스가 존재합니다.
파일 지속성 공급자 자체는 PersistenceProvider 추상 클래스에서 상속됩니다. 이 클래스는 다음 코드에서 정의됩니다.
namespace System.ServiceModel.Persistence
{
public abstract class PersistenceProvider : CommunicationObject
{
protected PersistenceProvider(Guid id);
public Guid Id { get; }
public abstract IAsyncResult BeginCreate(object instance, TimeSpan timeout, AsyncCallback callback, object state);
public abstract IAsyncResult BeginDelete(object instance, TimeSpan timeout, AsyncCallback callback, object state);
public abstract IAsyncResult BeginLoad(TimeSpan timeout, AsyncCallback callback, object state);
public virtual IAsyncResult BeginLoadIfChanged(TimeSpan timeout, object instanceToken, AsyncCallback callback, object state);
public abstract IAsyncResult BeginUpdate(object instance, TimeSpan timeout, AsyncCallback callback, object state);
public abstract object Create(object instance, TimeSpan timeout);
public abstract void Delete(object instance, TimeSpan timeout);
public abstract object EndCreate(IAsyncResult result);
public abstract void EndDelete(IAsyncResult result);
public abstract object EndLoad(IAsyncResult result);
public virtual bool EndLoadIfChanged(IAsyncResult result, out object instance);
public abstract object EndUpdate(IAsyncResult result);
public abstract object Load(TimeSpan timeout);
public virtual bool LoadIfChanged(TimeSpan timeout, object instanceToken, out object instance);
public abstract object Update(object instance, TimeSpan timeout);
}
}
지속성 공급자 클래스는 통신 개체이기도 합니다. 지속성 공급자에는 Create(), Update(), Load() 및 Delete()의 네 가지 메서드가 있습니다. 이러한 메서드의 비동기 variant는 비동기 variant의 오버로드와 함께 정의됩니다. 다음은 파일에 인스턴스 상태를 저장하는 데 적용되는 규칙입니다.
- 실제 파일은 서비스가 호스팅되는 컴퓨터의 Temp 디렉터리에 있는 FilePersistenceProvider 디렉터리에 저장됩니다.
- 인스턴스 상태는 파일의 이름이 인스턴스의 고유 식별자인 파일에 저장됩니다. 이 파일은 .bin 확장명을 사용하여 저장됩니다.
- 파일을 삭제해야 하는 경우에는 실제로 삭제되지 않고 "deleted"로 이름만 바뀝니다.
지속성 공급자의 구성
파일 지속성 공급자를 사용하려면 먼저 서비스에 대한 구성 파일에서 해당 공급자를 지정해야 합니다. 지속성 공급자 구성은 구성 파일의 servicebBehaviors 섹션에 지정되어 있습니다. 이 예제에서는 Web.config 파일의 항목을 보여 줍니다.
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior" >
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<windowsAuthentication allowAnonymousLogons="false" includeWindowsGroups="true" />
</serviceCredentials>
<persistenceProvider type="Microsoft.WorkflowServices.Samples.FilePersistenceProviderFactory, DurableServiceFactory, Version=1.0.0.0"/>
</behavior>
</serviceBehaviors>
</behaviors>
영속 서비스 코드 - 서비스 계약
다음 코드에서는 계산기 서비스의 서비스 계약을 보여 줍니다.
[ServiceContract(Namespace = "http://Microsoft.WorkflowServices.Samples")]
public interface ICalculator
{
[OperationContract()]
int PowerOn();
[OperationContract()]
int Add(int value);
[OperationContract()]
int Subtract(int value);
[OperationContract()]
int Multiply(int value);
[OperationContract()]
int Divide(int value);
[OperationContract()]
void PowerOff();
}
서비스 구현
다음 코드에서는 DurableServiceAttribute 특성을 서비스 구현에 사용하여 영속 서비스로 지정합니다.
[Serializable]
[DurableService]
public class DurableCalculator : ICalculator
{
int currentValue = default(int);
[DurableOperation(CanCreateInstance=true)]
public int PowerOn()
{
return currentValue;
}
[DurableOperation()]
public int Add(int value)
{
return (currentValue += value);
}
[DurableOperation()]
public int Subtract(int value)
{
return (currentValue -= value);
}
[DurableOperation()]
public int Multiply(int value)
{
return (currentValue *= value);
}
[DurableOperation()]
public int Divide(int value)
{
return (currentValue /= value);
}
[DurableOperation(CompletesInstance=true)]
public void PowerOff()
{
}
}
DurableOperationAttribute 특성은 작업이 완료된 후에 인스턴스 상태가 저장되도록 지정합니다.
DurableOperationAttribute 특성에서는 두 가지 매개 변수를 사용할 수 있습니다. CanCreateInstance 속성은 해당 작업이 호출될 때 인스턴스를 만들도록 지정합니다. CompletesInstance 속성은 이 특성이 지정된 작업의 실행이 완료될 때 서비스 인스턴스가 완료되도록 지정합니다. 작업이 완료되면 데이터베이스에서 상태도 삭제됩니다.
다음 코드에서는 IIS(인터넷 정보 서비스)에서 이 샘플을 호스팅하는 .svc 파일을 보여 줍니다.
<%@ServiceHost language=c# Debug="true" Service="Microsoft.WorkflowServices.Samples.DurableCalculator" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
서비스의 바인딩은 Web.config 파일에 구성됩니다. WSHttpContextBinding 바인딩은 응용 프로그램의 특정 인스턴스에 대한 요청을 라우트하는 데 사용되는 컨텍스트를 유지 관리하는 데 도움이 됩니다. 지속성 공급자를 지정하는 지속성 공급자 항목은 ServiceBehaviors 섹션에 있습니다.
샘플을 설치, 빌드 및 실행하려면
Windows Communication Foundation 샘플의 일회 설치 절차의 설치 지침을 수행했는지 확인합니다.
IIS의 경우 ServiceModelSamples 가상 디렉터리에서 Windows 인증을 활성화합니다.
IIS 5.1 또는 6.0에서 Windows 인증을 사용하려면
- 명령 프롬프트 창을 열고 start inetmgr 을 입력하여 IIS(인터넷 정보 서비스) MMC 스냅인을 엽니다.
- 기본 웹 사이트에서 가상 루트 ServiceModelSamples를 마우스 오른쪽 단추로 클릭하고 속성을 클릭한 다음 디렉터리 보안 탭을 클릭합니다.
- 인증 및 액세스 제어에서 편집을 클릭합니다.
- 인증 방법 대화 상자에서 Windows 통합 인증을 선택합니다.
IIS 7.0에서 Windows 인증을 사용하려면
- 명령 프롬프트 창을 열고 start inetmgr 을 입력하여 IIS(인터넷 정보 서비스) MMC 스냅인을 엽니다.
- 기본 웹 사이트에서 ServiceModelSamples 가상 루트를 선택합니다.
- ServiceModelSamples 홈 창에서 IIS 그룹에 있는 인증을 두 번 클릭합니다.
- Windows 인증을 선택하고 사용 작업을 선택합니다.
프로젝트를 빌드합니다. 프로젝트에서는 ServiceModelSamples를 빌드하고 업데이트합니다.
서비스가 올바르게 설치되었는지 확인하려면 https://localhost/ServiceModelSamples/service.svc 주소로 이동합니다. 서비스의 도움말 페이지가 표시됩니다. WSDL(웹 서비스 기술 언어)을 보려면 https://localhost/ServiceModelSamples/service.svc?wsdl을 입력합니다.
이 샘플을 실행하려면 Calculator Client 샘플을 사용해야 합니다. 이 샘플은 WPF(Windows Presentation Foundation)를 사용하여 만든 계산기 사용자 인터페이스로, 서비스의 클라이언트 역할을 합니다. 서비스의 영속성을 테스트하려면 계산기 서비스가 실행되는 동안 클라이언트를 닫았다가 다시 엽니다. 계산기 클라이언트는 같은 서비스 인스턴스와 다시 통신하며 아래쪽에 인스턴스 ID를 표시합니다. 계산기 클라이언트는 처음으로 호출할 때 Client.ctx라는 텍스트 파일을 사용하여 영속적인 위치(이 경우 샘플의 \bin 디렉터리)에 컨텍스트를 저장합니다. 클라이언트를 다시 열면 클라이언트에서 파일이 있는지 여부를 확인합니다. 파일이 있는 경우 저장된 컨텍스트를 만들려는 채널에 적용합니다. 서비스가 완료된 후 \bin 디렉터리에 있는 Client.ctx 파일로 클라이언트를 열면 클라이언트는 컨텍스트를 채널에 적용하려고 합니다. 그러면 통신하려는 서비스가 없기 때문에 오류가 발생합니다. 파일을 삭제하고 다시 시도합니다.
IIS를 다시 시작하여 서비스를 재생할 수도 있습니다. 모든 작업 후에는 지속성 저장소를 사용하기 때문에 서비스의 상태가 저장됩니다. 따라서 IIS를 시작한 후에 클라이언트에서 서비스와 통신을 시도하면 서비스 인프라에서 지속성 저장소의 인스턴스를 받고 같은 인스턴스와 통신할 수 있게 됩니다.
참고
IIS를 다시 시작한 후에 처음으로 작업을 호출하면 채널에서 보안 토큰이 만료되어 발생하는 MessageSecurityException 예외를 받게 됩니다. 다른 작업을 호출하면 성공합니다.
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.