영속 서비스
이 샘플에서는 계산기를 영속 서비스로 구현하여 영속 서비스를 만드는 방법을 보여 줍니다. 모든 호출이 끝난 뒤에도 서비스가 영속되기 때문에 서비스의 상태가 저장됩니다. 서비스가 재생하면 서비스의 상태가 최신 유지 지점으로 복원될 수 있으므로 유지 서비스가 필요합니다.
참고
이 샘플을 빌드하고 실행하려면 .NET Framework 버전 3.5를 설치해야 하고, 프로젝트 및 솔루션 파일을 열려면 Visual Studio 2008이 필요합니다.
이 샘플 설정에 대한 자세한 내용은 Windows Communication Foundation 샘플의 일회 설치 절차를 참조하십시오. 이 서비스와 함께 계산기 클라이언트를 실행해야 합니다. 자세한 내용은 이 항목 끝부분의 설치 절차를 참조하십시오.
다음 코드는 계산기 서비스의 서비스 계약을 보여 줍니다.
[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]
[DurableServiceBehavior]
public class DurableCalculator : ICalculator
{
int currentValue = default(int);
[DurableOperationBehavior(CanCreateInstance=true)]
public int PowerOn()
{
return currentValue;
}
[DurableOperationBehavior()]
public int Add(int value)
{
return (currentValue += value);
}
[DurableOperationBehavior()]
public int Subtract(int value)
{
return (currentValue -= value);
}
[DurableOperationBehavior()]
public int Multiply(int value)
{
return (currentValue *= value);
}
[DurableOperationBehavior()]
public int Divide(int value)
{
return (currentValue /= value);
}
[DurableOperationBehavior(CompletesInstance=true)]
public void PowerOff()
{
}
}
DurableOperationAttribute 특성은 작업이 완료된 후에 인스턴스 상태를 저장하도록 지정합니다.
DurableOperationAttribute 특성에는 지정할 수 있는 두 가지 필드가 있습니다.
CanCreateInstance 속성은 작업이 호출될 때 인스턴스를 만들도록 지정합니다. CanCreateInsatance가 제대로 작동하려면 이 속성이 지정된 작업이 요청/응답 작업이어야 합니다. 이 샘플에서는 컨텍스트가 클라이언트로 전파되며 클라이언트가 서비스와 통신하는 기능을 통해 영속성이 유지됩니다. 작업이 단방향인 경우에는 컨텍스트가 클라이언트에 전파되지 않으므로 서비스 인스턴스와의 대화를 오랫동안 영속적으로 수행하려면 다른 방법으로 클라이언트에 컨텍스트를 전달해야 합니다.
CompletesInstance 속성은 이 속성이 지정된 작업이 완료된 후에 인스턴스가 완료되도록 지정합니다. 작업이 완료된 후에는 데이터베이스에서도 상태가 삭제됩니다.
다음 코드는 IIS(인터넷 정보 서비스)에서 이 샘플을 호스팅하는 데 사용되는 .svc 파일을 보여 줍니다.
<%@ServiceHost language=c# Debug="true" Service="Microsoft.WorkflowServices.Samples.DurableCalculator" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
서비스의 바인딩은 Web.config 파일에 구성되어 있습니다. 쿠키를 사용하는 경우 BasicHttpContextBinding, BasicHttpContextBinding을 사용하지 않는 클라이언트의 경우 WSHttpContextBinding과 같이 다른 바인딩을 사용하는 두 개의 끝점이 노출됩니다. WSHttpContextBinding 바인딩을 통해 특정 영속 서비스 인스턴스에 대한 요청을 라우트하는 데 사용되는 컨텍스트를 간편하게 유지 관리할 수 있습니다. 지속성 공급자를 지정하는 PersistenceProvider
항목은 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를 빌드하고 업데이트합니다.
영속 저장소에 대한 액세스를 허용하려면
- Windows Communication Foundation 샘플의 일회 설치 절차 항목에 있는 CreateStores.cmd 스크립트를 실행합니다. 이 샘플에서는 NetFx35Samples_DurableServiceStore 데이터베이스를 사용합니다.
- ASP.NET 사용자 계정을 SQL Server 사용자 그룹의 멤버로 만듭니다.
서비스가 올바르게 설치되었는지 확인하려면 https://localhost/ServiceModelSamples/service.svc 주소로 이동합니다. 서비스의 도움말 페이지가 표시됩니다. WSDL(웹 서비스 설명 언어)을 확인하려면 다음을 입력합니다. https://localhost/ServiceModelSamples/service.svc?wsdl.
이 샘플을 실행하려면 Calculator Client 샘플을 사용해야 합니다. 이 샘플은 WPF(Windows Presentation Foundation)를 사용하여 만든 계산기 사용자 인터페이스로, 서비스의 클라이언트 역할을 합니다. 서비스가 제공하는 바인딩에 대응하는 여러 개의 끝점을 사용할 수 있습니다. 바인딩을 변경하려면 EndPoint 메뉴 항목을 클릭하고 BasicHttpContextBinding 또는 WSHttpContextBinding 중에서 적절한 바인딩을 선택합니다.
서비스의 영속성을 테스트하려면 계산기 클라이언트가 실행되는 동안 클라이언트를 닫았다가 다시 엽니다. 계산기 클라이언트가 동일한 서비스 인스턴스와 다시 통신하고 아래쪽에 인스턴스 ID를 표시합니다. 계산기 클라이언트는 처음 호출을 수행할 때 Client.ctx라는 텍스트 파일을 사용하여 영속 위치에 컨텍스트를 저장합니다(이 경우 샘플의 \bin 디렉터리). 클라이언트를 다시 열면 클라이언트에서 파일이 있는지 여부를 확인합니다. 파일이 있는 경우 클라이언트는 저장된 컨텍스트를 생성된 채널에 적용합니다. 영속 서비스가 완료된 후 \bin 디렉터리에 있는 Client.ctx 파일로 클라이언트를 열면 클라이언트는 컨텍스트를 채널에 적용하려고 합니다. 그러면 통신하려는 영속 서비스 인스턴스가 없기 때문에 오류가 발생합니다. 파일을 삭제하고 다시 시도합니다.
IIS를 다시 시작하여 영속 서비스를 재생할 수도 있습니다. 모든 작업 후에 지속성 저장소를 사용하기 때문에 서비스의 상태가 저장됩니다. 따라서 IIS를 시작한 후에 클라이언트에서 서비스와 통신을 시도하면 인프라에서 지속성 저장소의 영속 서비스 인스턴스를 받고 같은 인스턴스와 통신할 수 있게 됩니다.
참고
IIS를 다시 시작한 후에 처음으로 작업을 호출하면 채널에서 보안 토큰이 만료되어 발생하는 MessageSecurityException 예외를 받게 됩니다. 다른 작업을 호출하면 성공적으로 수행됩니다.
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.