Ändern der Cachefreigabeebenen für Send-AktivitätenChanging the Cache Sharing Levels for Send Activities

Mit der Erweiterung SendMessageChannelCache können Sie die Cachefreigabeebenen, die Einstellungen des Kanalfactorycaches und die Einstellungen des Kanalcaches für Workflows anpassen, die Nachrichten mit Send-Messagingaktivitäten an Dienstendpunkte senden.The SendMessageChannelCache extension enables you to customize the cache sharing levels, the settings of the channel factory cache, and the settings of the channel cache for workflows that send messages to service endpoints using Send messaging activities. Diese Workflows sind in der Regel Clientworkflows, könnten jedoch auch Workflowdienste sein, die in einem WorkflowServiceHost gehostet werden.These workflows are typically client workflows but could also be workflow services that are hosted in a WorkflowServiceHost. Der Kanalfactorycache enthält zwischengespeicherte ChannelFactory<TChannel>-Objekte.The channel factory cache contains cached ChannelFactory<TChannel> objects. Der Kanalcache enthält zwischengespeicherte Kanäle.The channel cache contains cached channels.

Hinweis

Workflows können mittels Send-Messagingaktivitäten Nachrichten oder Parameter senden.Workflows can use Send messaging activities to send either messages or parameters. Die Workflowlaufzeit fügt dem Cache Kanalfactorys hinzu, die Kanäle vom Typ IRequestChannel erstellen, wenn Sie eine ReceiveReply-Aktivität mit einer Send-Aktivität verwenden, bzw. einen Kanal vom Typ IOutputChannel, wenn Sie nur eine Send-Aktivität (kein ReceiveReply) verwenden.The workflow runtime adds channel factories to the cache that create channels of type IRequestChannel when you use a ReceiveReply activity with a Send activity, and an IOutputChannel when just using a Send activity (no ReceiveReply).

Die CachefreigabeebenenThe Cache Sharing Levels

In einem von einem WorkflowServiceHost gehosteten Workflow wird der von Send-Messagingaktivitäten verwendete Cache von allen Workflowinstanzen auf dem WorkflowServiceHost gemeinsam genutzt (Zwischenspeicherung auf Hostebene).By default, in a workflow hosted by a WorkflowServiceHost the cache used by Send messaging activities is shared across all workflow instances in the WorkflowServiceHost (host-level caching). Bei einen Clientworkflow, der nicht von einem WorkflowServiceHost gehostet wird, steht der Cache nur der Workflowinstanz zur Verfügung (Zwischenspeichern auf Instanzebene).For a client workflow that is not hosted by a WorkflowServiceHost, the cache is available only to the workflow instance (instance-level caching). Der Cache ist nur verfügbar für Send-Aktivitäten, die keine in der Konfiguration definierten Endpunkte verwenden, es sei denn, die Zwischenspeicherung im unsicheren Modus wurde aktiviert.The cache is only available for Send activities that do not use endpoints defined in configuration unless unsafe caching is enabled.

Im Folgenden sind die unterschiedlichen Cachefreigabeebenen für Send-Aktivitäten in einem Workflow mit Empfehlungen zur Verwendung aufgelistet:The following are the different cache sharing levels available for Send activities in a workflow and their recommended use:

  • Hostebene: auf dem Host, Freigabestufe, der Cache ist nur für die in dem Workflowdiensthost gehosteten Workflowinstanzen verfügbar.Host Level: In the host sharing level, the cache is available only to the workflow instances hosted in the workflow service host. Ein Cache kann auch prozessweit für mehrere Workflowdiensthosts freigegeben werden.A cache can also be shared between workflow service hosts in a process-wide cache.

  • -Instanzebene: In der Instanz, Freigabestufe, der Cache für eine bestimmte Workflowinstanz Dauer ihrer Lebensdauer verfügbar ist, aber der Cache ist nicht für andere Workflowinstanzen verfügbar.Instance Level: In the instance sharing level, the cache is available to a particular workflow instance throughout its lifetime but the cache is not available to other workflow instances.

  • Kein Cache: der Cache ist standardmäßig deaktiviert, wenn Sie einen Workflow vorliegen haben, die in der Konfiguration definierte Endpunkte verwendet.No Cache: The cache is turned off by default if you have a workflow that uses endpoints defined in configuration. Es wird empfohlen, den Cache in diesem Fall nicht zu aktivieren, da dies unsicher sein kann.It is also recommended to keep the cache turned off in this case because turning it on could be unsecure. Beispiel: Wenn eine andere Identität (andere Anmeldeinformationen oder Identitätswechsel) für jeden Sendevorgang benötigt wird.For example, if a different identity (different credentials or using impersonation) is required for each send.

Ändern der Cachefreigabeebene für einen ClientworkflowChanging the Cache Sharing Level for a Client Workflow

Um die Cachefreigabe für einen Clientworkflow festzulegen, fügen Sie dem gewünschten Satz von Workflowinstanzen eine Instanz der SendMessageChannelCache-Klasse als Erweiterung hinzu.To set the cache sharing in a client workflow, add an instance of the SendMessageChannelCache class as an extension to the desired set of workflow instances. So wird der Cache für alle Workflowinstanzen freigegeben.This results in sharing the cache across all the workflow instances. In den folgenden Codebeispielen wird die Ausführung dieser Schritte veranschaulicht.The following code examples show how to perform these steps.

Deklarieren Sie zuerst eine Instanz vom Typ SendMessageChannelCache.First, declare an instance of type SendMessageChannelCache.

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

Fügen Sie dann jeder einzelnen Clientworkflowinstanz die Cacheerweiterung hinzu.Next, add the cache extension to each client workflow instance.

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);  

Ändern der Cachefreigabeebene für einen gehosteten WorkflowdienstChanging the Cache Sharing Level for a Hosted Workflow Service

Um die Cachefreigabe für einen gehosteten Workflowdienst festzulegen, fügen Sie allen Workflowdiensthosts eine Instanz der SendMessageChannelCache-Klasse als Erweiterung hinzu.To set the cache sharing in a hosted workflow service, add an instance of the SendMessageChannelCache class as an extension to all the workflow service hosts. So wird der Cache für alle Workflowdiensthosts freigegeben.This results in sharing the cache across all the workflow service hosts. In den folgenden Codebeispielen wird die Ausführung dieser Schritte veranschaulicht.The following code examples show to perform these steps.

Deklarieren Sie zuerst eine Instanz vom Typ SendMessageChannelCache auf Klassenebene.First, declare an instance of type SendMessageChannelCache at the class level.

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

Fügen Sie dann jedem einzelnen Workflowdiensthost die statische Cacheerweiterung hinzu.Next, add the static cache extension to each workflow service host.

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);  

Um die Cachefreigabe für einen gehosteten Workflowdienst auf Instanzebene festzulegen, fügen Sie dem Workflowdiensthost einen Func<SendMessageChannelCache>-Delegaten als Erweiterung hinzu, und weisen Sie diesen Delegaten dem Code hinzu, der eine neue Instanz der SendMessageChannelCache-Klasse instanziiert.To set the cache sharing in a hosted workflow service to the instance level, add a Func<SendMessageChannelCache> delegate as an extension to the workflow service host and assign this delegate to the code that instantiates a new instance of the SendMessageChannelCache class. Auf diese Weise wird für jede einzelne Workflowinstanz ein anderer Cache verwendet.This results in a different cache for each individual workflow instance, instead of a single cache shared by all workflow instances in the workflow service host. Im folgenden Codebeispiel wird gezeigt, wie Sie dieses Ergebnis mit einem Lambda-Ausdruck erzielen, um die SendMessageChannelCache-Erweiterung, auf die der Delegat zeigt, direkt zu definieren.The following code example shows how to achieve this by using a lambda expression to directly define the SendMessageChannelCache extension that the delegate points to.

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 },  
});  

Anpassen von CacheeinstellungenCustomizing Cache Settings

Sie können die Cacheeinstellungen für den Kanalfactorycache und den Kanalcache anpassen.You can customize the cache settings for the channel factory cache and the channel cache. Die Cacheeinstellungen werden in der ChannelCacheSettings-Klasse definiert.The cache settings are defined in the ChannelCacheSettings class. Die SendMessageChannelCache-Klasse enthält Standardcacheeinstellungen für den Kanalfactorycache und den Kanalcache in ihrem Standardkonstruktor.The SendMessageChannelCache class defines default cache settings for the channel factory cache and the channel cache in its default constructor. In der folgenden Tabelle sind die Standardwerte für diese Cacheeinstellungen für die beiden Cachetypen aufgeführt.The following table lists the default values of these cache settings for each type of cache.

EinstellungenSettings LeaseTimeout (min)LeaseTimeout (min) IdleTimeout (min)IdleTimeout (min) MaxItemsInCacheMaxItemsInCache
Standardwert FactorycacheFactory Cache Default TimeSpan.MaxValueTimeSpan.MaxValue 22 1616
Standardwert KanalcacheChannel Cache Default 55 22 1616

Zum Anpassen der Einstellungen für den Factorycache und den Kanalcache instanziieren Sie die SendMessageChannelCache-Klasse mit dem parametrisierten Konstruktor SendMessageChannelCache, und übergeben Sie eine neue Instanz des ChannelCacheSettings-Elements mit benutzerdefinierten Werten an jeden factorySettings-Parameter und channelSettings-Parameter.To customize the factory cache and channel cache settings, instantiate the SendMessageChannelCache class using the parameterized constructor SendMessageChannelCache and pass a new instance of the ChannelCacheSettings with custom values to each of the factorySettings and channelSettings parameters. Fügen Sie danach die neue Instanz dieser Klasse als Erweiterung einem Workflowdiensthost oder einer Workflowinstanz hinzu.Next, add the new instance of this class as an extension to a workflow service host or a workflow instance. Im folgenden Codebeispiel wird gezeigt, wie diese Schritte für eine Workflowinstanz ausgeführt werden.The following code example shows how to perform these steps for a workflow instance.

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);  

Wenn Ihr Workflowdienst in der Konfiguration definierte Endpunkte verwendet, müssen Sie zum Aktivieren des Cache die SendMessageChannelCache-Klasse instanziieren, wobei Sie den parametrisierten Konstruktor SendMessageChannelCache verwenden und der allowUnsafeCaching-Parameter auf true festgelegt sein muss.To enable caching when your workflow service has endpoints defined in configuration, instantiate the SendMessageChannelCache class using the parameterized constructor SendMessageChannelCache with the allowUnsafeCaching parameter set to true. Fügen Sie danach die neue Instanz dieser Klasse als Erweiterung einem Workflowdiensthost oder einer Workflowinstanz hinzu.Next, add the new instance of this class as an extension to a workflow service host or a workflow instance. Im folgenden Codebeispiel wird gezeigt, wie der Cache für eine Workflowinstanz aktiviert wird.The following code example shows how to enable caching for a workflow instance.

SendMessageChannelCache customChannelCacheExtension =   
    new SendMessageChannelCache{ AllowUnsafeCaching = true };  

clientInstance.Extensions.Add(customChannelCacheExtension);  

Wenn Sie den Cache für die Kanalfactorys und die Kanäle komplett deaktivieren möchten, deaktivieren Sie den Kanalfactorycache.To disable the cache completely for the channel factories and the channels, disable the channel factory cache. Hierdurch wird automatisch auch der Kanalcache deaktiviert, da die Kanäle den jeweiligen Kanalfactorys untergeordnet sind.Doing so also turns off the channel cache as the channels are owned by their corresponding channel factories. Um den Kanalfactorycache zu deaktivieren, übergeben Sie den factorySettings-Parameter an den SendMessageChannelCache-Konstruktor, initialisiert auf eine ChannelCacheSettings-Instanz mit dem MaxItemsInCache-Wert auf 0 (null).To disable the channel factory cache, pass the factorySettings parameter to the SendMessageChannelCache constructor initialized to a ChannelCacheSettings instance with a MaxItemsInCache value of 0. Dies wird im folgenden Codebeispiel gezeigt.The following code example shows this.

// 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);  

Sie können auch den Kanalfactorycache verwenden und nur den Kanalcache deaktivieren, indem Sie den channelSettings-Parameter an den SendMessageChannelCache-Konstruktor übergeben, initialisiert auf eine ChannelCacheSettings-Instanz mit dem MaxItemsInCache-Wert auf 0 (null).You can choose to use only the channel factory cache and disable the channel cache by passing the channelSettings parameter to the SendMessageChannelCache constructor initialized to a ChannelCacheSettings instance with a MaxItemsInCache value of 0. Dies wird im folgenden Codebeispiel gezeigt.The following code example shows this.

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);  

In einem gehosteten Workflowdienst können Sie die Einstellungen für den Factorycache und den Channelcache in der Anwendungskonfigurationsdatei angeben.In a hosted workflow service, you can specify the factory cache and channel cache settings in the application configuration file. Fügen Sie dafür ein Dienstverhalten hinzu, das die Cacheeinstellungen für die Factory und den Channelcache enthält, und fügen Sie dieses Dienstverhalten dem Dienst hinzu.To do so, add a service behavior that contains the cache settings for the factory and channel cache and add this service behavior to your service. Das folgende Beispiel zeigt den Inhalt einer Konfigurationsdatei, die enthält die MyChannelCacheBehavior -Dienstverhalten mit cacheeinstellungen für die benutzerdefinierte Factory und den channelcache.The following example shows the contents of a configuration file that contains the MyChannelCacheBehavior service behavior with the custom factory cache and channel cache settings. Dieses Dienstverhalten wird hinzugefügt, um den Dienst über die behaviorConfiguarion Attribut.This service behavior is added to the service through the behaviorConfiguarion attribute.

<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>