WorkflowServiceHost による side-by-side でのバージョン管理

.NET Framework 4.5 で導入された、WorkflowServiceHost による side-by-side バージョン管理は、1 つのエンドポイントでワークフロー サービスの複数のバージョンをホストする機能を提供します。 提供される side-by-side 機能により、既存の定義を使用してインスタンスを実行しているときに、新しいワークフロー定義を使用してワークフロー サービスの新しいインスタンスが作成されるように、ワークフロー サービスを構成できます。 このトピックでは、WorkflowServiceHost を使用したワークフロー サービスの side-by-side での実行の概要を提供します。

ワークフロー サービスでの複数のバージョンのホスティング

WorkflowServiceHost には、ワークフローの複数のバージョンを side-by-side 実行するように構成できる SupportedVersionsDefinitionIdentity の 2 つのプロパティが含まれています。 SupportedVersions には、ワークフロー サービスのサポートされているバージョンが含まれます。DefinitionIdentity は、各ワークフロー サービスを一意に識別するために使用されます。 これは、WorkflowIdentity をワークフロー サービスと関連付けることによって行われます。 WorkflowIdentity には 3 種類の識別情報が格納されます。 NameVersion は必須で、名前と Version を表します。また、Package は省略可能で、アセンブリ名やその他の必要な情報などの情報を格納する追加文字列の指定に使用できます。 SupportedVersions コレクションに含まれる各ワークフロー サービスは、一意の WorkflowIdentity を持つ必要があります。 WorkflowIdentity は、その 3 つのプロパティのいずれかが他の WorkflowIdentity と異なる場合に一意です。 nullWorkflowIdentity は、DefinitionIdentity に有効な値ですが、nullWorkflowIdentity を持つことができるのは、ワークフロー サービスの以前のバージョンのうちの 1 つのみです。

重要

WorkflowIdentity には、個人を特定できる情報 (PII) を含めないでください。 WorkflowIdentity は、Name (String)、Version (Version)、および Package (String) の 3 つの部分で構成されます。 インスタンスの作成に使用される WorkflowIdentity に関する情報は、ランタイムによるアクティビティ ライフ サイクルのさまざまなポイントで構成されているすべての追跡サービスに出力されます。 WF の追跡には PII (機密ユーザー データ) を非表示にするメカニズムがありません。 そのため、WorkflowIdentity インスタンスには PII データを含めないでください。PII データは、ランタイムによって追跡レコードに出力され、追跡レコードを表示するためのアクセス権を持つユーザーに表示できます。

ワークフロー サービスでの複数のバージョンのホスティングに関する規則

ユーザーが追加のバージョンを WorkflowServiceHost に追加する場合、エンドポイントと説明の同じセットを使用してワークフロー サービスをホストするために満たす必要があるいくつかの条件があります。 追加のバージョンのいずれかがこれらの条件を満たすことができない場合、WorkflowServiceHostOpen が呼び出されたときに例外をスローします。 追加のバージョンとしてホストに提供される各ワークフロー定義は、次の要件を満たす必要があります (プライマリ バージョンは、ホストのコンストラクターに提供されるワークフロー サービス定義です)。 追加のワークフローのバージョンは、次の条件を満たす必要があります。

  • ワークフロー サービスのプライマリ バージョンと同じ Name を持つ必要があります。

  • プライマリ バージョンにない ReceiveSendReply アクティビティまたは Body アクティビティがあってはならず、これらは操作コントラクトに一致する必要があります。

  • 一意の DefinitionIdentity を持つ必要があります。 nullDefinitionIdentity を持つことができるワークフロー定義は 1 つだけです。

一部の変更は可能です。 次の項目は、バージョン間で異なることができます。

  • DefinitionIdentity は、プライマリ バージョンと異なる名前およびパッケージを持つことができます。

  • AllowBufferedReceive 値は、プライマリ バージョンと異なることができます。

  • ConfigurationName 値は、プライマリ バージョンと異なることができます。

  • ImplementedContracts 値は、プライマリ バージョンと異なることができます。

DefinitionIdentity の構成

ワークフロー デザイナーを使用してワークフロー サービスを作成する場合は、 [プロパティ] ウィンドウを使用して DefinitionIdentity を設定します。 デザイナーのサービスのルート アクティビティの外部でクリックしてワークフロー サービスを選択し、 [表示] メニューの [プロパティ ウィンドウ] を選択します。 DefinitionIdentity プロパティの横にあるドロップダウン リストから [WorkflowIdentity] を選択して展開し、目的の WorkflowIdentity プロパティを指定します。 次の例の DefinitionIdentity は、MortgageWorkflow という Name と、1.0.0.0 という Version で構成されています。 Package は省略可能です。この例では、null です。

DefinitionIdentity プロパティを示すスクリーンショット。

ワークフロー サービスが自己ホスト型の場合、DefinitionIdentity はワークフロー サービスを構築するときに構成されます。 次の例では、DefinitionIdentity が、前の例と同じ値 (MortgageWorkflow という Nameと、1.0.0.0 という Name) で構成されています。

WorkflowService service = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflow(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(1, 0, 0, 0)  
    }  
};  
Dim service As New WorkflowService  
With service  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflow  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(1, 0, 0, 0) _  
    }  
End With  

DefinitionIdentity は必須ではありませんが、DefinitionIdentitynull にすることができるのは、1 つのバージョンのみです。

注意

これは、最初に DefinitionIdentity を構成せずにサービスを配置し、後で更新されたバージョンを作成する場合に便利です。

Web ホスト ワークフロー サービスへの新しいバージョンの追加

Web ホスト サービスで新しいバージョンのワークフロー サービスを構成する最初の手順では、App_Code フォルダーにサービス ファイルと同じ名前を持つ新しいフォルダーを作成します。 たとえば、サービスの xamlx ファイルの名前が MortgageWorkflow.xamlx である場合は、フォルダーに MortgageWorkflow という名前を付ける必要があります。 元のサービスの xamlx ファイルをこのフォルダーにコピーした後、新しい名前 (たとえば、MortgageWorkflowV1.xamlx) に変更します。 プライマリ サービスに必要な変更を加え、その DefinitionIdentity を更新し、サービスを展開します。 次の例の DefinitionIdentity は、Name という値の MortgageWorkflowVersion という値の 2.0.0.0 で更新されています。

WorkflowIdentity の DefinitionIdentity を示すスクリーンショット。

サービスが再起動されたとき、以前のバージョンは指定された App_Code サブフォルダーにないため、SupportedVersions コレクションに自動的に追加されます。 ワークフロー サービスのプライマリ バージョンの DefinitionIdentitynull である場合は、以前のバージョンが追加されないことに注意してください。 nullDefinitionIdentity を持つことができるのは 1 つのバージョンのみです。しかし、複数のバージョンがある場合、プライマリ バージョンは nullDefinitionIdentity を持つバージョンであることはできません。そうでないと、以前のバージョンが SupportedVersions コレクションに追加されません。

自己ホスト型ワークフロー サービスへの新しいバージョンの追加

自己ホスト型ワークフロー サービスに新しいバージョンを追加する場合、ワークフロー サービスのプライマリ バージョンを使用して WorkflowServiceHost が構成されます。以前のバージョンは明示的に SupportedVersions コレクションに追加する必要があります。 次の例では、WorkflowServiceHost ワークフロー定義を使用するプライマリ ワークフロー サービスを使用して MortgageWorkflowV2 が構成されています。さらに、MortgageWorkflowV1 ワークフロー定義を使用して構成されたワークフロー サービスが SupportedVersions コレクションに追加されています。 各ワークフロー サービスは、ワークフロー定義のバージョンを反映する一意の DefinitionIdentity で構成されます。

// Create the primary version of the workflow service.  
WorkflowService serviceV2 = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflowV2(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(2, 0, 0, 0)  
    }  
};  
  
// Configure the WorkflowServiceHost with the current version  
// of the workflow service. This code requires Administrator  
// privileges to function correctly. If running from Visual  
// Studio, Visual Studio must be run with Administrator privileges.  
WorkflowServiceHost host = new WorkflowServiceHost(serviceV2,
    new Uri("http://localhost:8080/MortgageWorkflowService"));  
  
// Create the previous version of the workflow service.  
WorkflowService serviceV1 = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflowV1(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(1, 0, 0, 0)  
    }  
};  
  
// Add the previous version of the service to the SupportedVersions collection.  
host.SupportedVersions.Add(serviceV1);  
'Create the primary version of the workflow service  
Dim serviceV2 As New WorkflowService  
With serviceV2  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflowV2  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(2, 0, 0, 0) _  
    }  
End With  
  
'Configure the WorkflowServiceHost with the current version  
'of the workflow service. This code requires Administrator  
'privileges to function correctly. If running from Visual  
'Studio, Visual Studio must be run with Administrator privileges.  
  
Dim host As New WorkflowServiceHost(serviceV2, _  
    New Uri("http://localhost:8080/MortgageWorkflowService"))  
  
'Create the previous version of the workflow service.  
Dim serviceV1 As New WorkflowService  
With serviceV1  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflowV1  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(1, 0, 0, 0) _  
    }  
End With  
  
'Add the previous version of the service to the SupportedVersions collection.  
host.SupportedVersions.Add(serviceV1)