Modifica dei livelli di condivisione della cache per le attività SendChanging the Cache Sharing Levels for Send Activities

L'estensione SendMessageChannelCache consente di personalizzare i livelli di condivisione della cache, le impostazioni della cache della channel factory e della cache del canale per i flussi di lavoro che inviano messaggi agli endpoint del servizio tramite le attività di messaggistica Send.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. Questi sono in genere flussi di lavoro del client ma potrebbero essere anche servizi del flusso di lavoro ospitati in un oggetto WorkflowServiceHost.These workflows are typically client workflows but could also be workflow services that are hosted in a WorkflowServiceHost. La cache della channel factory contiene gli oggetti ChannelFactory<TChannel> memorizzati nella cache.The channel factory cache contains cached ChannelFactory<TChannel> objects. La cache del canale contiene i canali memorizzati nella cache.The channel cache contains cached channels.

Nota

I flussi di lavoro possono utilizzare le attività di messaggistica Send per inviare messaggi o parametri.Workflows can use Send messaging activities to send either messages or parameters. L'esecuzione del flusso di lavoro aggiunge channel factory alla cache che creano canali di tipo IRequestChannel quando si utilizza un'attività ReceiveReply con un'attività Send e un oggetto IOutputChannel quando si utilizza solo un'attività Send (nessuna attività ReceiveReply).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).

Livelli di condivisione della cacheThe Cache Sharing Levels

Per impostazione predefinita, in un flusso di lavoro ospitato da un oggetto WorkflowServiceHost, la cache utilizzata dalle attività di messaggistica Send è condivisa da tutte le istanze del flusso di lavoro nell'oggetto WorkflowServiceHost (memorizzazione nella cache a livello di host).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). Per un flusso di lavoro del client che non è ospitato da un oggetto WorkflowServiceHost, la cache è disponibile solo all'istanza del flusso di lavoro (memorizzazione nella cache a livello di istanza).For a client workflow that is not hosted by a WorkflowServiceHost, the cache is available only to the workflow instance (instance-level caching). La cache è disponibile solo per le attività Send che non utilizzano gli endpoint definiti nella configurazione, a meno che non sia abilitata la memorizzazione nella cache non sicura.The cache is only available for Send activities that do not use endpoints defined in configuration unless unsafe caching is enabled.

Di seguito sono riportati i diversi livelli di condivisione della cache disponibili per le attività Send in un flusso di lavoro e il relativo utilizzo consigliato:The following are the different cache sharing levels available for Send activities in a workflow and their recommended use:

  • Livello host: Nel livello di condivisione host la cache è disponibile solo per le istanze del flusso di lavoro ospitate nell'host del servizio del flusso di lavoro.Host Level: In the host sharing level, the cache is available only to the workflow instances hosted in the workflow service host. Una cache può essere condivisa anche tra host del servizio flusso di lavoro di una cache a livello di processo.A cache can also be shared between workflow service hosts in a process-wide cache.

  • Livello istanza: Nel livello di condivisione dell'istanza la cache è disponibile per una particolare istanza del flusso di lavoro per tutta la sua durata, ma la cache non è disponibile per altre istanze del flusso di lavoro.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.

  • Nessuna cache: Per impostazione predefinita, la cache è disattivata se si dispone di un flusso di lavoro che utilizza gli endpoint definiti nella configurazione.No Cache: The cache is turned off by default if you have a workflow that uses endpoints defined in configuration. In questo caso, è consigliabile mantenere disattivata la cache anche perché l'attivazione potrebbe risultare non sicura,It is also recommended to keep the cache turned off in this case because turning it on could be unsecure. ad esempio, se per ogni invio è necessaria un'identità diversa (credenziali diverse o utilizzo della rappresentazione).For example, if a different identity (different credentials or using impersonation) is required for each send.

Modifica del livello di condivisione della cache per un flusso di lavoro clientChanging the Cache Sharing Level for a Client Workflow

Per impostare la condivisione della cache in un flusso di lavoro client, aggiungere un'istanza della classe SendMessageChannelCache come estensione al set desiderato di istanze del flusso di lavoro.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. In questo modo la cache viene condivisa in tutte le istanze del flusso di lavoro.This results in sharing the cache across all the workflow instances. Negli esempi di codice seguenti viene mostrato come eseguire questi passaggi.The following code examples show how to perform these steps.

Innanzitutto, dichiarare un'istanza di tipo SendMessageChannelCache.First, declare an instance of type SendMessageChannelCache.

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

Successivamente, aggiungere l'estensione della cache a ogni istanza del flusso di lavoro client.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);  

Modifica del livello di condivisione della cache per un servizio di flusso di lavoro ospitatoChanging the Cache Sharing Level for a Hosted Workflow Service

Per impostare la condivisione della cache in un servizio di flusso di lavoro ospitato, aggiungere un'istanza della classe SendMessageChannelCache come estensione a tutti gli host del servizio di flusso di lavoro.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. In questo modo la cache viene condivisa in tutti gli host del servizio di flusso di lavoro.This results in sharing the cache across all the workflow service hosts. Negli esempi di codice seguenti viene mostrato come eseguire questi passaggi.The following code examples show to perform these steps.

Innanzitutto, dichiarare un'istanza di tipo SendMessageChannelCache a livello di classe.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();  

Successivamente, aggiungere l'estensione della cache statica a ogni host del servizio di flusso di lavoro.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);  

Per impostare la divisione della cache in un servizio flusso di lavoro ospitato a livello di istanza, aggiungere un delegato Func<SendMessageChannelCache> come estensione all'host del servizio flusso di lavoro e assegnare questo delegato al codice che crea una nuova istanza della classe SendMessageChannelCache.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. Ciò comporta una cache diversa per ogni singola istanza del flusso di lavoro, anziché una sola cache condivisa da tutte le istanze del flusso di lavoro nell'host del servizio flusso di lavoro.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. Nell'esempio di codice seguente viene mostrato come eseguire questa operazione tramite un'espressione lambda per definire direttamente l'estensione SendMessageChannelCache a cui il delegato fa riferimento.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 },  
});  

Personalizzazione delle impostazioni della cacheCustomizing Cache Settings

È possibile personalizzare le impostazioni della cache della channel factory e del canale.You can customize the cache settings for the channel factory cache and the channel cache. Le impostazioni della cache sono definite nella classe ChannelCacheSettings.The cache settings are defined in the ChannelCacheSettings class. La SendMessageChannelCache classe definisce le impostazioni della cache predefinite per la cache della channel factory e la cache del canale nel costruttore senza parametri.The SendMessageChannelCache class defines default cache settings for the channel factory cache and the channel cache in its parameterless constructor. Nella tabella seguente vengono elencati i valori predefiniti di queste impostazioni per ogni tipo di cache.The following table lists the default values of these cache settings for each type of cache.

ImpostazioniSettings LeaseTimeout (min)LeaseTimeout (min) IdleTimeout (min)IdleTimeout (min) MaxItemsInCacheMaxItemsInCache
Valore predefinito della cache della factoryFactory Cache Default TimeSpan.MaxValueTimeSpan.MaxValue 22 1616
Valore predefinito della cache del canaleChannel Cache Default 55 22 1616

Per personalizzare le impostazioni della cache della factory e del canale, creare un'istanza della classe SendMessageChannelCache utilizzando il costruttore con parametri SendMessageChannelCache e passare una nuova istanza dell'oggetto ChannelCacheSettings con valori personalizzati a ognuno dei parametri factorySettings e channelSettings.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. Successivamente aggiungere la nuova istanza di questa classe come estensione a un host del servizio di flusso di lavoro o a un'istanza del flusso di lavoro.Next, add the new instance of this class as an extension to a workflow service host or a workflow instance. Nell'esempio di codice seguente viene mostrato come eseguire questi passaggi per un'istanza del flusso di lavoro.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);  

Per abilitare la memorizzazione nella cache quando il servizio di flusso di lavoro dispone di endpoint definiti nella configurazione, creare un'istanza della classe SendMessageChannelCache utilizzando il costruttore con parametri SendMessageChannelCache con il parametro allowUnsafeCaching impostato su true.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. Successivamente aggiungere la nuova istanza di questa classe come estensione a un host del servizio di flusso di lavoro o a un'istanza del flusso di lavoro.Next, add the new instance of this class as an extension to a workflow service host or a workflow instance. Nell'esempio di codice seguente viene mostrato come abilitare la memorizzazione nella cache per un'istanza del flusso di lavoro.The following code example shows how to enable caching for a workflow instance.

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

Per disabilitare completamente la cache per le channel factory e i canali, disabilitare la cache della channel factory.To disable the cache completely for the channel factories and the channels, disable the channel factory cache. In questo modo viene disattivata anche la cache del canale poiché i canali appartengono alle channel factory corrispondenti.Doing so also turns off the channel cache as the channels are owned by their corresponding channel factories. Per disabilitare la cache della channel factory, passare il parametro factorySettings al costruttore SendMessageChannelCache inizializzato su un'istanza ChannelCacheSettings con un valore MaxItemsInCache pari a 0.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. Nell'esempio di codice seguente viene illustrata questa operazione.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);  

È possibile scegliere di utilizzare solo la cache della channel factory e disabilitare la cache del canale passando il parametro channelSettings al costruttore SendMessageChannelCache inizializzato su un'istanza ChannelCacheSettings con un valore MaxItemsInCache pari a 0.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. Nell'esempio di codice seguente viene illustrata questa operazione.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 un servizio flusso di lavoro ospitato è possibile specificare le impostazioni della cache della factory e della cache del canale nel file di configurazione dell'applicazione.In a hosted workflow service, you can specify the factory cache and channel cache settings in the application configuration file. A tale scopo, aggiungere un comportamento del servizio contenente le impostazioni della cache della factory e del canale e aggiungere tale comportamento al servizio.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. Nell'esempio seguente viene illustrato il contenuto di un file di configurazione che MyChannelCacheBehavior contiene il comportamento del servizio con le impostazioni della cache factory e della cache del canale personalizzate.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. Questo comportamento del servizio viene aggiunto al servizio tramite l' behaviorConfiguration attributo.This service behavior is added to the service through the behaviorConfiguration 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>