다음을 통해 공유


방법: 영속 서비스의 지속성 사용

영속 서비스는 영속적이고 오래 실행되며 응용 프로그램과 서버가 다시 시작된 후에도 유지되도록 디자인된 WCF(Windows Communication Foundation) 서비스입니다. 영속 서비스는 SqlPersistenceProviderFactory에서 만들어진 기본 공급자나 PersistenceProvider 또는 LockingPersistenceProvider 추상 클래스에서 파생된 사용자 지정 지속성 공급자를 사용하여 유지됩니다.

LockingPersistenceProvider 추상 클래스는 PersistenceProvider에서 파생되고 서비스 상태 정보의 명시적 잠금, 잠금 해제, 로드, 저장 및 삭제에 대한 기능을 노출합니다. 서비스 상태 정보는 저장 또는 삭제 작업이 발생하기 전에 잠기므로 여러 호스트 간의 데이터 경합이 발생하지 않습니다. 상태 데이터에 대한 잠금을 가져오려면 다음 두 기준을 충족해야 합니다.

  • 레코드의 lockOwner가 null이어야 합니다.

  • 레코드의 lockExpiration 값이 현재 DateTime보다 작아야 합니다(즉, 이전 잠금이 모두 만료되어야 함).

잠금을 가져오면 레코드의 lockOwner 필드가 잠그는 호스트의 호스트 ID(각 공급자 인스턴스에 고유하고 공급자의 생성자에서 생성됨)로 설정되고 레코드의 lockExpiration 값이 DateTime.UtcNow에 잠금 제한 시간 값을 더한 값으로 설정됩니다. 이 값은 지속성 공급자의 생성자에 제공된 값이거나 공급자 구현 클래스에 정의된 기본값입니다. 기본 SqlPersistenceProviderFactory 구현에서 기본값은 잠금이 기본적으로 사용되지 않음을 의미하는 0입니다. 잠금이 이미 유지되고 있는 경우 lockInstance 매개 변수를 True로 설정하여 Lock 또는 Load를 호출하면 잠금 제한 시간 값도 업데이트됩니다. 또한 잠금이 이미 유지되고 있는 경우 unlockInstance 매개 변수를 False로 설정하여 Save를 호출할 때도 잠금 제한 시간이 업데이트됩니다.

SqlPersistenceProviderFactoryLockingPersistenceProvider 추상 클래스의 기본 구현을 만듭니다. SqlPersistenceProviderFactory는 SQL 2005를 상태 유지 저장소로 사용하며 텍스트나 이진 형식으로 상태 정보를 유지할 수 있습니다.

SqlPersistenceProviderFactory는 최대 3개의 생성자 매개 변수를 사용하여 만들 수 있습니다. 다음 표에는 세 생성자 매개 변수가 나와 있습니다.

lockTimeout

잠금 소유권에 대한 제한 시간. 이 제한 시간 후에 서비스 상태 인스턴스의 잠금이 자동으로 해제됩니다. 제한 시간이 0(기본값)이면 잠금이 사용되지 않고 TimeSpan.MaxValue 값이면 잠금이 만료되지 않습니다.

connectionString

SQL 데이터베이스에 연결하는 데 사용되는 매개 변수가 포함된 문자열. 구성 파일을 사용하여 지속성 공급자를 구성할 때 연결 문자열은 다른 생성 매개 변수와 함께 배치되지 않고 connectionStrings 노드에 배치됩니다.

serializeAsText

상태 정보가 XML 또는 이진 형식으로 유지될지 여부를 나타내는 부울 값. 기본값은 False(이진 serialization을 나타냄)입니다.

서비스 상태 데이터는 InstanceData 테이블에 유지됩니다. 다음 표에서는 InstanceData 테이블의 필드를 보여 줍니다.

id

상태 인스턴스의 고유 식별자입니다.

instanceType

저장될 인스턴스의 형식입니다.

instance

이진 데이터로 유지되는 인스턴스 상태입니다. 인스턴스가 텍스트로 유지되는 경우 null입니다.

instanceXml

XML로 유지되는 인스턴스 상태입니다. 인스턴스가 이진 데이터로 유지되는 경우 null입니다.

created

인스턴스가 데이터베이스에 처음 기록된 UTC 시간입니다.

lastUpdated

인스턴스가 데이터베이스에 마지막으로 기록된 UTC 시간입니다.

lockOwner

레코드에 대한 잠금을 현재 소유한 호스트의 호스트 ID이거나 활성 잠금이 없는 경우 null입니다.

lockExpiration

잠금이 만료될 UTC 시간입니다.

코드에서 클래스의 생성자를 사용하여 SqlPersistenceProviderFactory를 구성할 수 있지만 일반적으로 응용 프로그램 구성 파일을 사용하여 SqlPersistenceProviderFactory와 일반적 서비스 공급자를 구성하는 것이 좋습니다. 샘플 구성은 다음과 같습니다. 영속 서비스 구성 파일의 형식은 WCF(Windows Communication Foundation) 서비스의 경우와 동일합니다.

<configuration>
  <connectionStrings>
    <add name="LocalConnection" 
      connectionString="
        Initial Catalog=SqlPersistence;
        Data Source=localhost;
        Integrated Security=SSPI;" 
    />
  </connectionStrings>  <system.serviceModel>
    <services>
      <service 
        name="SampleService"
        behaviorConfiguration="ServiceBehavior">
        <endpoint
          address="ISampleService_Basic"
          binding="basicHttpContextBinding"
          contract="SampleApplication.ISampleService"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <persistenceProvider
            persistenceOperationTimeout="00:00:15"
            type="
              System.ServiceModel.Persistence.SqlPersistenceProviderFactory,
              System.WorkflowServices,
              Version=3.5.0.0",
              Culture=neutral,
              PublicKeyToken=31bf3856ad364e5"
            connectionStringName="LocalConnection",
            lockTimeout="00:10:00" 
          />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

영속 서비스 구성

코드에서 구현되는 WCF 서비스는 대개 SQL 데이터베이스와 같은 저장 매체에 유지된 다음 클라이언트에서 특정 서비스에 언제든지 연결할 수 있도록 다시 로드될 수 있습니다.

영속 서비스는 워크플로 서비스와 동일한 개체 모델을 사용하고 동일한 기본 컨텍스트 프로토콜 메커니즘을 사용하므로 올바른 서비스 인스턴스에 메시지를 라우팅할 수 있습니다.

코드에 작성된 영속 서비스와 워크플로로 작성된 영속 서비스의 차이점은 워크플로는 작업 호출 중에 유지될 수 있지만 영속 서비스는 작업 호출이 완료된 후 유지되는 것입니다.

서비스 구현을 영속으로 표시하려면 DurableServiceAttribute를 사용하여 서비스를 표시합니다. 다음 표에는 이 특성에 사용 가능한 매개 변수가 나와 있습니다.

SaveStateInOperationTransaction

모든 인스턴스 상태를 명시적으로 트랜잭션 상태로 만듭니다. 이 플래그는 ConcurrencyModeSingle이고 모든 작업이 트랜잭션 아래에서 실행됨을 확인합니다. TransactionScopeRequiredTrue로 설정되어야 하거나 TransactionFlowOption이 설정되어야 합니다.

서비스에 대해 이 특성이 있으면 ApplyDispatchBehavior 메서드가 메시지에서 인스턴스 ID를 올바르게 추출하여 올바른 인스턴스로 라우팅하고 호출 시 지속 작업을 수행하도록 필요한 DispatchRuntime 구성 요소를 구성합니다.

영속 서비스의 작업은 DurableOperationAttribute를 사용하여 표시되어야 합니다. 다음 표에는 이 특성의 속성이 나와 있습니다.

CompletesInstance

이 작업이 완료된 후 인스턴스가 완료되어 유지되고 메모리에서 언로드되도록 지정합니다. 기본값은 False입니다.

다음 코드 샘플에서는 영속 서비스를 만드는 방법을 보여 줍니다.

[ServiceContract()]
public interface IService1
{
    [OperationContract]
    string MyOperation1(string myValue);
    [OperationContract]
    string MyOperation2(DataContract1 dataContractValue);
}
[DurableService(MyPersistenceProvider)]
public class service1 : IService1
{
    [DurableOperation]
    public string MyOperation1(string myValue)
    {
        Return "Hello: " + myValue;
    }
    [DurableOperation]
    string MyOperation2(DataContract1 dataContractValue)
    {
        return "Hello: " + dataContractValue.DataName;
    }
}
[DataContract]
public class DataContract1
{
    string dataNameValue;
    [DataMember]
    public string DataName
    {
        get { return dataNameValue; }
        set { dataNameValue = value; }
    }
}

참고 항목

기타 리소스

자습서: 영속 서비스 만들기
워크플로 서비스 및 영속 서비스 만들기

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.