Share via


永続性サービスのサンプル

Download sample

このサンプルでは、電卓を永続性サービスとして実装することによって永続性サービスを作成する方法を示します。毎回の呼び出しの後はサービスが永続的であるため、サービスの状態が保存されます。サービスをリサイクルする場合は、その状態が直前の永続性ポイントに復元可能となります。このため、永続性サービスが必要になります。

Noteメモ :

このサンプルをビルドして実行するには、.NET Framework Version 3.5 をインストールする必要があります。Visual Studio 2008 では、プロジェクト ファイルとソリューション ファイルを開く必要があります。

このサンプルのセットアップの詳細については、「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」を参照してください。電卓クライアントは、このサービスと共に実行する必要があります。詳細については、このトピックの最後のセットアップ手順を参照してください。

次のコードは、電卓サービスのサービス コントラクトを示しています。

[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 属性で指定できるフィールドは 2 つあります。

CanCreateInstance プロパティは、操作が呼び出されたときにインスタンスを作成することを指定します。CanCreateInsatance が適切に機能するには、指定された操作が要求/応答操作である必要があります。 このサンプルでは、コンテキストがクライアントに伝達され、永続性はサービスと通信するクライアントの機能によって実現されます。操作が一方向の場合、コンテキストはクライアントに伝達されません。このため、サービス インスタンスで時間のかかる持続的な通信が行われる場合は、コンテキストをクライアントに渡す別の方法が必要です。

CompletesInstance プロパティは、指定されている操作の完了後にインスタンスが完了することを指定します。操作の完了後、状態もデータベースから削除されます。

次のコードは、インターネット インフォメーション サービス (IIS: Internet Information Services) でこのサンプルをホストする .svc ファイルを示しています。

<%@ServiceHost language=c# Debug="true" Service="Microsoft.WorkflowServices.Samples.DurableCalculator" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

サービスのバインディングは、Web.config ファイルで構成されています。異なるバインディングを持つ 2 つのエンドポイントは、cookie が有効な BasicHttpContextBinding と、BasicHttpContextBinding を使用しないクライアントの WSHttpContextBinding で公開されます。WSHttpContextBinding バインディングは、特定のワークフロー インスタンスに要求をルーティングするときに使用するコンテキストを保持します。永続化プロバイダを指定する PersistenceProvider エントリは、ServiceBehaviors セクションにあります。

サービスを設定および実行するには

  1. スクリプトを使用してこのサンプルを適切に設定するには、「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」を参照してください。

  2. IIS で、ServiceModelSamples 仮想ディレクトリの Windows 認証を有効にします。

    IIS 5.1 または 6.0 で Windows 認証を有効にするには

    1. コマンド プロンプト ウィンドウを開き、「start inetmgr」と入力して、インターネット インフォメーション サービス (IIS) MMC スナップインを開きます。

    2. [既定の Web サイト] 内の仮想ルート [ServiceModelSamples] を右クリックし、[プロパティ] をクリックして、[ディレクトリ セキュリティ] タブをクリックします。

    3. [認証とアクセス制御][編集] をクリックします。

    4. [認証方法] ダイアログ ボックスで、[統合 Windows 認証] をオンにします。

    IIS 7.0 で Windows 認証を有効にするには

    1. コマンド プロンプト ウィンドウを開き、「start inetmgr」と入力して、インターネット インフォメーション サービス (IIS) MMC スナップインを開きます。

    2. [既定の Web サイト] 内の [ServiceModelSamples] 仮想ルートを選択します。

    3. [ServiceModelSamples] ホーム ペイン内で [IIS] グループの [認証] をダブルクリックします。

    4. [Windows 認証] を選択し、[有効] アクションを選択します。

  3. プロジェクトをビルドします。プロジェクトがビルドされ、ServiceModelSamples が更新されます。

  4. 永続的ストアへのアクセスを許可するには

    1. Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」に示した Createstores.cmd スクリプトを実行します。この例では、NetFx35Samples_DurableServiceStore データベースを使用します。

    2. SQL Server ユーザー グループのメンバに ASP.NET ユーザー アカウントを作成します。

  5. サービスが正しくインストールされたことを確認するには、アドレス https://localhost/ServiceModelSamples/service.svc をポイントします。サービスのヘルプ ページが表示されます。Web サービス記述言語 (WSDL: Web Services Descriptor Language) を参照するには、「https://localhost/servicemodelsamples/service.svc?wsdl」と入力します。

  6. このサンプルを実行するには、電卓クライアントのサンプルを使用する必要があります。これは、サービスのクライアントとして機能する を使用して作成された電卓ユーザー インターフェイスです。エンドポイントは、サービスが提供するバインディングに対応する異なるエンドポイントを使用できます。バインディングを変更するには、[エンドポイント] メニュー項目をクリックし、適切なバインディング [BasicHttpContextBinding] または [WSHttpContextBinding] を選択します。

  7. サービスの永続的性質をテストするには、電卓クライアントの実行中にクライアントを一度閉じてから開きます。電卓クライアントは同じサービス インスタンスと通信し、下部にインスタンス ID が表示されます。電卓クライアントは、Client.ctx というテキスト ファイルを使用して、最初に呼び出しが行われた永続性のある場所 (この場合はサンプルの \bin ディレクトリ) にコンテキストを格納します。クライアントを再度開くと、ファイルがあるかどうかが確認されます。ファイルがある場合は、格納されたコンテキストが作成中のチャネルに適用されます。ワークフロー サービスが終了した後に、\bin ディレクトリにまだ残っている Client.ctx ファイルを使用してクライアントを開いた場合は、チャネルへのコンテキストの適用が試みられます。しかし、通信するワークフロー インスタンスが存在しないため、エラーが発生します。ファイルを削除して、やり直してください。

  8. IIS を再起動してワークフロー サービスをリサイクルすることもできます。毎回の操作の後で永続的ストアを使用するため、サービスの状態が格納されます。したがって、IIS の再起動後にクライアントからサービスと通信しようとすると、ワークフロー インフラストラクチャが永続的ストアからワークフロー インスタンスを受信するため、同じインスタンスと通信できます。

    Noteメモ :

    IIS を再起動した後に初めて操作を呼び出したときに、MessageSecurityException 例外が発生します。これはチャネルのセキュリティ トークンの期限切れにより発生する例外です。他の操作を呼び出すと、成功します。

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.