このサンプルでは、永続性サービスと共に動作する永続化プロバイダを作成する方法を示します。永続化プロバイダはワークフロー サービスの拡張機能であり、このサンプルでは永続性サービスの作成方法を示します。サービス インスタンスの状態は、コンピュータ上のファイルに格納されます。
サンプルには電卓サービスが実装されています。これは、「永続性サービスのサンプル」と同じです。このサービスでは、標準的な SQL ロックの永続化プロバイダを使用せずにサンプル内で作成されたファイルの永続化プロバイダを使用する点が異なります。
![]() |
---|
このサンプルをビルドして実行するには、.NET Framework Version 3.5 をインストールする必要があります。プロジェクト ファイルとソリューション ファイルを開くには、Visual Studio 2008 が必要です。 |
「電卓クライアントのサンプル」はこのサービスと共に実行する必要があります (詳細については、このトピックの最後のセットアップ手順を参照してください)。
ファイルの永続化プロバイダ
このサンプルのファイルの永続化プロバイダは 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
はサービス ランタイムで使用される間オブジェクトの有効期間を管理するために必要なメソッドを提供します。
プロバイダのファクトリ パターンにより、ファクトリはプロバイダのすべてのインスタンスに共通なリソースを管理します。たとえば、ファイルの永続化プロバイダの場合は、ファクトリによって永続化ファイルが格納され実際のファイルの永続化プロバイダのすべてのインスタンスで共有される場所が決まります。
その結果、サービスの各インスタンスにプロバイダのインスタンスが 1 つあることになります。また、各ホストには、ファクトリのインスタンスが 1 つあります。
ファイルの永続化プロバイダ自体は 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()
の 4 つのメソッドがあります。これらのメソッドの非同期のバリエーションは、非同期のバリエーションのオーバーロードと同様に定義されます。ファイルにインスタンスの状態を格納するときは次の規則が適用されます。
実際のファイルは、サービスがホストされているコンピュータの Temp ディレクトリの FilePersistenceProvider ディレクトリに格納されます。
インスタンスの状態は、インスタンスの一意の識別子の名前の付いたファイルに格納されます。ファイルには .bin 拡張子が付き、格納されます。
ファイルを削除する必要がある場合は、実際に削除されるのではなく、"deleted" という名前に変更されます。
永続化プロバイダの構成
ファイルの永続化プロバイダは、使用する前にサービスの構成ファイルに指定する必要があります。永続化プロバイダの構成は、構成ファイルの service behaviors
セクションに指定されています。次の例は、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 属性で使用できるパラメータは 2 つあります。CanCreateInstance プロパティは、その操作を呼び出したときにインスタンスを作成することを指定します。CompletesInstance プロパティは、この属性が指定されている操作の実行が終了してからサービス インスタンスが終了することを指定します。操作の完了後に、状態もデータベースから削除されます。
次のコードは、インターネット インフォメーション サービス (IIS: Internet Information Services) でこのサンプルをホストする .svc ファイルを示しています。
<%@ServiceHost language=c# Debug="true" Service="Microsoft.WorkflowServices.Samples.DurableCalculator" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
サービスのバインドは Web.config ファイルで構成されています。WSHttpContextBinding バインドは、特定のワークフロー インスタンスに要求をルーティングするときに使用するコンテキストを保持します。永続化プロバイダを指定する永続化プロバイダのエントリは ServiceBehaviors
セクションにあります。
サンプルを設定、ビルド、および実行するには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」のセットアップ手順を実行します。
IIS で、ServiceModelSamples 仮想ディレクトリの Windows 認証を有効にします。
IIS 5.1 または 6.0 で Windows 認証を有効にするには
コマンド プロンプト ウィンドウを開き、「start inetmgr」と入力して、インターネット インフォメーション サービス (IIS) MMC スナップインを開きます。
[既定の Web サイト] 内の仮想ルート [ServiceModelSamples] を右クリックし、[プロパティ] をクリックし、[ディレクトリ セキュリティ] タブをクリックします。
[認証とアクセス制御] の [編集] をクリックします。
[認証方法] ダイアログ ボックスで [統合 Windows 認証] をオンにします。
IIS 7.0 で Windows 認証を有効にするには
コマンド プロンプト ウィンドウを開き、「start inetmgr」と入力して、インターネット インフォメーション サービス (IIS) MMC スナップインを開きます。
[既定の Web サイト] 内の [ServiceModelSamples] 仮想ルートを選択します。
[ServiceModelSamples] ホーム ペイン内で [IIS] グループの [認証] をダブルクリックします。
[Windows 認証] を選択し、[有効] アクションを選択します。
プロジェクトをビルドします。プロジェクトは ServiceModelSamples をビルドし更新します。
サービスが正しくインストールされたことを確認するには、アドレス [https://localhost/servicemodelsamples/service.svc] をポイントします。サービスのヘルプ ページが表示されます。Web サービス記述言語 (WSDL: Web Services Descriptor Language) を参照するには、「https://localhost/servicemodelsamples/service.svc?wsdl」と入力します。
このサンプルを実行するには、電卓クライアントのサンプルを使用する必要があります。これは、サービスのクライアントとして機能する を使用して作成される電卓ユーザー インターフェイスです。サービスの永続的性質をテストするには、電卓クライアントの実行中にクライアントを一度閉じてから開きます。電卓クライアントは同じサービス インスタンスに通知し、下部にインスタンスの ID が表示されます。電卓クライアントは、Client.ctx というテキスト ファイルを使用して、最初に呼び出しが行われた永続性のある場所 (この場合、サンプルの \bin ディレクトリ) にコンテキストを格納します。クライアントを再度開くと、ファイルがあるかどうかが確認されます。ファイルがある場合は、格納されたコンテキストを作成されたチャネルに適用します。ワークフロー サービスが終了し、\bin ディレクトリにまだ残っている Client.ctx ファイルでクライアントを開く場合は、コンテキストをチャンネルに適用しようとしますが、通信するワークフロー インスタンスが存在しないため、エラーが発生します。ファイルを削除して、やり直してください。
IIS を再起動してワークフロー サービスをリサイクルすることもできます。毎回操作の後で永続ストアを使用するため、サービスの状態が格納されます。したがって、IIS の再起動後にクライアントからサービスと通信しようとすると、ワークフロー インフラストラクチャは永続ストアからワークフロー インスタンスを受信し、同じインスタンスと通信できます。
メモ :
IIS を再起動してから初めて操作を呼び出すと、MessageSecurityException 例外が発生します。これはチャネルのセキュリティ トークンの期限切れにより発生する例外です。他の操作を呼び出せば成功します。
Copyright © 2007 by Microsoft Corporation.All rights reserved.