次の方法で共有


送信アクティビティのキャッシュ共有レベルの変更

SendMessageChannelCache拡張機能を使用すると、Send メッセージング アクティビティを使用してサービス エンドポイントにメッセージを送信するワークフローのキャッシュ共有レベル、チャネル ファクトリ キャッシュの設定、チャネル キャッシュの設定をカスタマイズできます。 通常、これらのワークフローはクライアント ワークフローですが、 WorkflowServiceHostでホストされるワークフロー サービスである場合もあります。 チャネル ファクトリ キャッシュには、キャッシュされた ChannelFactory<TChannel> オブジェクトが含まれています。 チャネル キャッシュには、キャッシュされたチャネルが含まれています。

ワークフローでは、 Send メッセージング アクティビティを使用して、メッセージまたはパラメーターを送信できます。 ワークフロー ランタイムは、Send アクティビティでReceiveReply アクティビティを使用する場合はIRequestChannelタイプのチャネルを作成するチャネル ファクトリをキャッシュに追加し、Send アクティビティのみを使用する場合はIOutputChannel (ReceiveReplyなし) を作成します。

キャッシュ共有レベル

既定では、 WorkflowServiceHost によってホストされるワークフローでは、 Send メッセージング アクティビティによって使用されるキャッシュは、 WorkflowServiceHost 内のすべてのワークフロー インスタンス間で共有されます (ホスト レベルのキャッシュ)。 WorkflowServiceHostによってホストされていないクライアント ワークフローの場合、キャッシュはワークフロー インスタンスでのみ使用できます (インスタンス レベルのキャッシュ)。 キャッシュは、安全でないキャッシュが有効になっていない限り、構成で定義されたエンドポイントを使用しない Send アクティビティでのみ使用できます。

ワークフロー内の Send アクティビティで使用できるさまざまなキャッシュ共有レベルと、推奨される使用方法を次に示します。

  • ホスト レベル: ホスト共有レベルでは、キャッシュはワークフロー サービス ホストでホストされているワークフロー インスタンスでのみ使用できます。 キャッシュは、プロセス全体のキャッシュ内のワークフロー サービス ホスト間で共有することもできます。

  • インスタンス レベル: インスタンス共有レベルでは、キャッシュは有効期間を通じて特定のワークフロー インスタンスで使用できますが、キャッシュは他のワークフロー インスタンスでは使用できません。

  • キャッシュなし: 構成で定義されたエンドポイントを使用するワークフローがある場合、キャッシュは既定でオフになります。 また、キャッシュをオンにすると安全ではない可能性があるため、この場合はキャッシュをオフにしておくことをお勧めします。 たとえば、送信ごとに異なる ID (異なる資格情報または偽装の使用) が必要な場合です。

クライアント ワークフローのキャッシュ共有レベルの変更

クライアント ワークフローでキャッシュ共有を設定するには、 SendMessageChannelCache クラスのインスタンスを拡張として目的のワークフロー インスタンスのセットに追加します。 これにより、すべてのワークフロー インスタンス間でキャッシュが共有されます。 次のコード例は、これらの手順を実行する方法を示しています。

まず、 SendMessageChannelCache型のインスタンスを宣言します。

// Create an instance of SendMessageChannelCache with default cache settings.  
static SendMessageChannelCache sharedChannelCacheExtension =  
    new SendMessageChannelCache();  

次に、各クライアント ワークフロー インスタンスにキャッシュ拡張機能を追加します。

WorkflowApplication clientInstance1 = new WorkflowApplication(new clientWorkflow1());  
WorkflowApplication clientInstance2 = new WorkflowApplication(new clientWorkflow2());  
  
// Share the cache extension object
  
clientInstance1.Extensions.Add(sharedChannelCacheExtension);  
clientInstance2.Extensions.Add(sharedChannelCacheExtension);  

ホストされるワークフロー サービスのキャッシュ共有レベルの変更

ホストされているワークフロー サービスでキャッシュ共有を設定するには、 SendMessageChannelCache クラスのインスタンスを拡張機能としてすべてのワークフロー サービス ホストに追加します。 これにより、すべてのワークフロー サービス ホスト間でキャッシュが共有されます。 次のコード例は、これらの手順を実行するために示しています。

まず、クラス レベルで SendMessageChannelCache 型のインスタンスを宣言します。

// Create static instance of SendMessageChannelCache with default cache settings.  
static SendMessageChannelCache sharedChannelCacheExtension = new  
    SendMessageChannelCache();  

次に、各ワークフロー サービス ホストに静的キャッシュ拡張機能を追加します。

WorkflowServiceHost host1 = new WorkflowServiceHost(new serviceWorkflow1(), new Uri(baseAddress1));  
WorkflowServiceHost host2 = new WorkflowServiceHost(new serviceWorkflow2(), new Uri(baseAddress2));  
  
// Share the static cache to get an AppDomain level cache.  
host1.WorkflowExtensions.Add(sharedChannelCacheExtension);  
host2.WorkflowExtensions.Add(sharedChannelCacheExtension);  

ホストされているワークフロー サービスのキャッシュ共有をインスタンス レベルに設定するには、 Func<SendMessageChannelCache> デリゲートをワークフロー サービス ホストの拡張機能として追加し、このデリゲートを、 SendMessageChannelCache クラスの新しいインスタンスをインスタンス化するコードに割り当てます。 これにより、ワークフロー サービス ホスト内のすべてのワークフロー インスタンスによって共有される 1 つのキャッシュではなく、個々のワークフロー インスタンスごとに異なるキャッシュが作成されます。 次のコード例は、ラムダ式を使用して、デリゲートが指す SendMessageChannelCache 拡張機能を直接定義することによってこれを実現する方法を示しています。

serviceHost.WorkflowExtensions.Add(() => new SendMessageChannelCache  
{  
    // Use FactorySettings property to add custom factory cache settings.  
    FactorySettings = new ChannelCacheSettings
    { MaxItemsInCache = 5, },  
    // Use ChannelSettings property to add custom channel cache settings.  
    ChannelSettings = new ChannelCacheSettings
    { MaxItemsInCache = 10 },  
});  

キャッシュ設定のカスタマイズ

チャネル ファクトリ キャッシュとチャネル キャッシュのキャッシュ設定をカスタマイズできます。 キャッシュ設定は、 ChannelCacheSettings クラスで定義されます。 SendMessageChannelCache クラスは、チャネル ファクトリ キャッシュとそのパラメーターなしのコンストラクター内のチャネル キャッシュの既定のキャッシュ設定を定義します。 次の表に、キャッシュの種類ごとのこれらのキャッシュ設定の既定値を示します。

設定 LeaseTimeout (分) IdleTimeout (分) MaxItemsInCache
ファクトリ キャッシュの既定値 TimeSpan.MaxValue 2 16
チャネル キャッシュの既定値 5 2 16

ファクトリ キャッシュとチャネル キャッシュの設定をカスタマイズするには、パラメーター化されたコンストラクター SendMessageChannelCacheを使用してSendMessageChannelCache クラスをインスタンス化し、カスタム値を持つChannelCacheSettingsの新しいインスタンスを各factorySettingsおよびchannelSettingsパラメーターに渡します。 次に、このクラスの新しいインスタンスを拡張機能としてワークフロー サービス ホストまたはワークフロー インスタンスに追加します。 次のコード例は、ワークフロー インスタンスに対してこれらの手順を実行する方法を示しています。

ChannelCacheSettings factorySettings = new ChannelCacheSettings{  
                        MaxItemsInCache = 5,
                        IdleTimeout = TimeSpan.FromMinutes(5),
                        LeaseTimeout = TimeSpan.FromMinutes(20)};  
  
ChannelCacheSettings channelSettings = new ChannelCacheSettings{  
                        MaxItemsInCache = 5,
                        IdleTimeout = TimeSpan.FromMinutes(2),  
                        LeaseTimeout = TimeSpan.FromMinutes(10) };  
  
SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache(factorySettings, channelSettings);  
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

ワークフロー サービスでエンドポイントが構成で定義されているときにキャッシュを有効にするには、パラメーター化されたコンストラクター SendMessageChannelCacheを使用してSendMessageChannelCache クラスをインスタンス化し、allowUnsafeCaching パラメーターを true に設定します。 次に、このクラスの新しいインスタンスを拡張機能としてワークフロー サービス ホストまたはワークフロー インスタンスに追加します。 次のコード例は、ワークフロー インスタンスのキャッシュを有効にする方法を示しています。

SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache{ AllowUnsafeCaching = true };  
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

チャネル ファクトリとチャネルのキャッシュを完全に無効にするには、チャネル ファクトリ キャッシュを無効にします。 これにより、チャネルが対応するチャネル ファクトリによって所有されるため、チャネル キャッシュもオフになります。 チャネル ファクトリ キャッシュを無効にするには、factorySettings パラメーターを、MaxItemsInCache値が 0 のChannelCacheSettings インスタンスに初期化されたSendMessageChannelCache コンストラクターに渡します。 次のコード例は、これを示しています。

// Disable the factory cache. This results in the channel cache to be turned off as well.  
ChannelCacheSettings factorySettings = new ChannelCacheSettings  
    { MaxItemsInCache = 0 };  
  
ChannelCacheSettings channelSettings = new ChannelCacheSettings();  
  
SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache(factorySettings, channelSettings);
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

MaxItemsInCache値が 0 のChannelCacheSettings インスタンスに初期化されたSendMessageChannelCache コンストラクターに channelSettings パラメーターを渡すことで、チャネル ファクトリ キャッシュのみを使用し、チャネル キャッシュを無効にすることができます。 次のコード例は、これを示しています。

ChannelCacheSettings factorySettings = new ChannelCacheSettings();  
// Disable only the channel cache.  
ChannelCacheSettings channelSettings = new ChannelCacheSettings  
    { MaxItemsInCache = 0};  
  
SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache(factorySettings, channelSettings);
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

ホストされているワークフロー サービスでは、アプリケーション構成ファイルでファクトリ キャッシュとチャネル キャッシュの設定を指定できます。 これを行うには、ファクトリ キャッシュとチャネル キャッシュのキャッシュ設定を含むサービス動作を追加し、このサービス動作をサービスに追加します。 次の例は、カスタム ファクトリ キャッシュとチャネル キャッシュ設定を使用した MyChannelCacheBehavior サービス動作を含む構成ファイルの内容を示しています。 このサービス動作は、 behaviorConfiguration 属性を使用してサービスに追加されます。

<configuration>
  <system.serviceModel>  
    <!-- List of other config sections here -->
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="MyChannelCacheBehavior">  
          <sendMessageChannelCache allowUnsafeCaching ="false" >  
            <!-- Control only the host level settings -->
            <factorySettings maxItemsInCache = "8" idleTimeout = "00:05:00" leaseTimeout="10:00:00" />  
            <channelSettings maxItemsInCache = "32" idleTimeout = "00:05:00" leaseTimeout="00:06:00" />  
          </sendMessageChannelCache>  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    <services>  
      <service name="MyService" behaviorConfiguration="MyChannelCacheBehavior" />  
    </services>  
  </system.serviceModel>  
</configuration>