方法 : 永続性サービスの永続性を有効にする

永続性サービスは、アプリケーションやサーバーを再起動した後も永続的に長期間実行しておくことのできる Windows Communication Foundation (WCF) サービスです。永続性サービスは、SqlPersistenceProviderFactory によって作成されたプロバイダを使用するか、抽象クラス PersistenceProvider または LockingPersistenceProvider から派生したカスタム永続化プロバイダを使用して永続化されます。

LockingPersistenceProvider 抽象クラスは PersistenceProvider から派生し、サービス状態情報のロック、ロック解除、ロード、保存、および削除を明示的に行うための機能を公開します。サービス状態情報は、複数のホスト間でデータの競合が発生しないように、保存操作または削除操作を行う前にロックされます。状態データに対するロックを取得するには、次の 2 つの条件を満たす必要があります。

  • レコードの lockOwner が null 値であること。

  • レコードの lockExpiration 値が現在の DateTime よりも小さいこと (つまり、以前のロックの有効期限が切れていること)。

ロックを取得すると、レコードの lockOwner フィールドがロック対象ホストのホスト ID (各プロバイダ インスタンスに固有で、プロバイダのコンストラクタで生成されます) に設定され、レコードの lockExpiration 値が、DateTime.UtcNow にロックのタイムアウト値を加算した値に設定されます (この値は、永続化プロバイダのコンストラクタに提供された値、またはプロバイダ実装クラスで定義されている既定値のいずれかです。SqlPersistenceProviderFactory のそのままの実装では、既定値は 0 であり、ロックは既定で使用されません)。ロックが既に保持されている場合は、lockInstance パラメータを True に設定して Lock または Load を呼び出すと、ロックのタイムアウト値も更新されます。また、ロックが既に保持されており、unlockInstance パラメータを False に設定して Save を呼び出した場合も、ロックのタイムアウト値が更新されます。

SqlPersistenceProviderFactory は、LockingPersistenceProvider 抽象クラスのそのままの実装を生成します。SqlPersistenceProviderFactory は、永続化ストアとして SQL 2005 をターゲットとしており、テキスト形式またはバイナリ形式のいずれかで状態情報を永続化できます。

SqlPersistenceProviderFactory は、最大 3 つのコンストラクタ パラメータを使用して作成できます。次の表は、その 3 つのコンストラクタ パラメータを示しています。

lockTimeout

ロック所有権のタイムアウト。このタイムアウト後、サービス状態インスタンスのロックが自動的に解除されます。タイムアウトを 0 (既定値) にすると、ロックは使用されません。TimeSpan.MaxValue の値を使用すると、ロックの有効期限がなくなります。

connectionString

SQL データベースに接続するためのパラメータを含んでいる文字列。構成ファイルを使用して永続化プロバイダを構成する場合、接続文字列は他の作成パラメータと共に配置するのではなく、connectionStrings ノードに配置します。

serializeAsText

状態情報を XML 形式とバイナリ形式のどちらで永続化するかを指定するブール値。既定値は False (バイナリ形式のシリアル化) です。

サービス状態データは InstanceData テーブルに永続化されます。次の表は、InstanceData テーブルのフィールドを示しています。

id

状態インスタンスの一意の識別子。

instanceType

保存されるインスタンスの型。

instance

バイナリ データとして永続化されているインスタンス状態。インスタンスがテキストとして永続化されている場合は null になります。

instanceXml

XML として永続化されているインスタンス状態。インスタンスがバイナリ データとして永続化されている場合は null になります。

created

インスタンスが最初にデータベースに書き込まれたときの UTC 時刻。

lastUpdated

インスタンスが最後にデータベースに書き込まれたときの UTC 時刻。

lockOwner

現時点でレコードに対するロックを所有しているホストのホスト ID。アクティブなロックが存在しない場合は null になります。

lockExpiration

ロックの有効期限が切れる UTC 時刻。

SqlPersistenceProviderFactory は、クラスのコンストラクタを使用してコード内で構成できますが、通常はアプリケーション構成ファイルを使用して構成することをお勧めします (通常のサービス プロバイダも、同様に構成することをお勧めします)。構成例は次のとおりです (永続性サービス構成ファイルの形式は Windows Communication Foundation (WCF) サービスの形式と同じです)。

<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 を設定する必要があります)。

この属性がサービスに存在する場合、必要な DispatchRuntime コンポーネントが ApplyDispatchBehavior メソッドによって、メッセージからインスタンス ID を適切に抽出し、これを適切なインスタンスにルーティングし、呼び出し時に永続化操作を実行するように構成されます。

永続性サービスに対する操作は、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.