Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’extension SendMessageChannelCache vous permet de personnaliser les niveaux de partage du cache, les paramètres du cache de fabrication de canaux et les paramètres du cache de canaux, pour les flux de travail qui envoient des messages aux points de terminaison de service par le biais d’activités de messagerie Send. Ces flux de travail sont généralement des flux de travail clients, mais peuvent également être des services de flux de travail hébergés dans un WorkflowServiceHost. Le cache de fabrication de canaux contient des objets ChannelFactory<TChannel> mis en cache. Le cache de canal contient des canaux mis en cache.
Remarque
Les flux de travail peuvent utiliser Send des activités de messagerie pour envoyer des messages ou des paramètres. Le runtime du workflow ajoute au cache des fabriques de canaux qui créent des canaux du type IRequestChannel si vous utilisez une activité ReceiveReply avec une activité Send, et un objet IOutputChannel si vous utilisez simplement une activité Send (sans ReceiveReply).
Niveaux de partage du cache
Par défaut, dans un flux de travail hébergé par un WorkflowServiceHost, le cache utilisé par les activités de messagerie Send est partagé entre toutes les instances de flux de travail à l’hôte WorkflowServiceHost (mise en cache au niveau de l’hôte). Pour un flux de travail client qui n’est pas hébergé par un WorkflowServiceHost, le cache est disponible uniquement pour l’instance de workflow (mise en cache au niveau de l’instance). Le cache est disponible uniquement pour Send les activités qui n’utilisent pas de points de terminaison définis dans la configuration, sauf si la mise en cache non sécurisée est activée.
Voici les différents niveaux de partage de cache disponibles pour Send les activités dans un flux de travail et leur utilisation recommandée :
Niveau de l’hôte : dans le niveau de partage de l’hôte, le cache est disponible uniquement pour les instances de flux de travail hébergées dans l’hôte du service de flux de travail. Un cache peut également être partagé entre les hôtes de service de flux de travail dans un cache à l’échelle du processus.
Niveau d’instance : dans le niveau de partage d’instance, le cache est disponible pour une instance de flux de travail particulière tout au long de sa durée de vie, mais le cache n’est pas disponible pour d’autres instances de flux de travail.
Aucun cache : le cache est désactivé par défaut si vous disposez d’un flux de travail qui utilise des points de terminaison définis dans la configuration. Il est également recommandé de conserver le cache désactivé dans ce cas, car l’activation peut être non sécurisée. Par exemple, si une identité différente (informations d’identification différentes ou utilisation de l’emprunt d’identité) est requise pour chaque envoi.
Modification du niveau de partage du cache pour un flux de travail client
Pour définir le partage de cache dans un flux de travail client, ajoutez une instance de la SendMessageChannelCache classe en tant qu’extension à l’ensemble souhaité d’instances de flux de travail. Cela entraîne le partage du cache sur toutes les instances de flux de travail. Les exemples de code suivants montrent comment effectuer ces étapes.
Tout d’abord, déclarez une instance de type SendMessageChannelCache.
// Create an instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension =
new SendMessageChannelCache();
Ensuite, ajoutez l’extension de cache à chaque instance de workflow client.
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);
Modification du niveau de partage du cache pour un service de flux de travail hébergé
Pour définir le partage de cache dans un service de flux de travail hébergé, ajoutez une instance de la SendMessageChannelCache classe en tant qu’extension à tous les hôtes du service de flux de travail. Cela entraîne le partage du cache sur tous les hôtes du service de flux de travail. Les exemples de code suivants montrent comment effectuer ces étapes.
Tout d’abord, déclarez une instance de type SendMessageChannelCache au niveau de la classe.
// Create static instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension = new
SendMessageChannelCache();
Ensuite, ajoutez l’extension de cache statique à chaque hôte de service de workflow.
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);
Pour définir le partage de cache dans un service de flux de travail hébergé au niveau de l’instance, ajoutez un Func<SendMessageChannelCache> délégué en tant qu’extension à l’hôte du service de flux de travail et affectez ce délégué au code qui instancie une nouvelle instance de la SendMessageChannelCache classe. Cela entraîne un cache différent pour chaque instance de flux de travail individuelle, au lieu d’un seul cache partagé par toutes les instances de flux de travail dans l’hôte du service de flux de travail. L'exemple de code suivant indique comment parvenir à ce résultat, à l'aide d'une expression lambda permettant de définir directement l'extension SendMessageChannelCache vers laquelle le délégué pointe.
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 },
});
Personnalisation des paramètres du cache
Vous pouvez personnaliser les paramètres du cache de fabrication de canaux et du cache de canaux. Les paramètres de cache sont définis dans la ChannelCacheSettings classe. La classe SendMessageChannelCache définit les paramètres de cache par défaut pour le cache de l’usine de chaînes et le cache de chaînes dans son constructeur sans paramètre. Le tableau suivant répertorie les valeurs par défaut de ces paramètres de cache pour chaque type de cache.
| Paramètres | LeaseTimeout (min) | IdleTimeout (min) | NombreMaximalD'élémentsEnCache |
|---|---|---|---|
| Valeur par défaut du cache de fabrication | TimeSpan.MaxValue | 2 | 16 |
| Valeur par défaut du cache de canal | 5 | 2 | 16 |
Pour personnaliser les paramètres du cache d’usine et du cache de canal, instanciez la classe SendMessageChannelCache à l’aide du constructeur paramétré SendMessageChannelCache et transmettez une nouvelle instance de ChannelCacheSettings avec des valeurs personnalisées à chacun des paramètres factorySettings et channelSettings. Ensuite, ajoutez la nouvelle instance de cette classe en tant qu’extension à un hôte de service de flux de travail ou à une instance de flux de travail. L’exemple de code suivant montre comment effectuer ces étapes pour une instance de workflow.
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);
Pour activer la mise en cache lorsque votre service de workflow a des points de terminaison définis dans la configuration, instanciez la SendMessageChannelCache classe à l’aide du constructeur SendMessageChannelCache paramétré avec le allowUnsafeCaching paramètre défini sur true. Ensuite, ajoutez la nouvelle instance de cette classe en tant qu’extension à un hôte de service de flux de travail ou à une instance de flux de travail. L’exemple de code suivant montre comment activer la mise en cache pour une instance de workflow.
SendMessageChannelCache customChannelCacheExtension =
new SendMessageChannelCache{ AllowUnsafeCaching = true };
clientInstance.Extensions.Add(customChannelCacheExtension);
Pour désactiver complètement le cache pour les fabriques de canaux et les canaux, désactivez le cache de fabrication de canaux. Cela désactive également le cache de canal, car les canaux appartiennent à leurs fabriques de canaux correspondantes. Pour désactiver le cache de fabrication de canaux, passez le paramètre factorySettings au constructeur SendMessageChannelCache initialisé avec une instance ChannelCacheSettings ayant 0 comme valeur MaxItemsInCache. L’exemple de code suivant montre ceci.
// 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);
Vous pouvez choisir d'utiliser uniquement le cache de fabrication de canaux et de désactiver le cache de canaux en transmettant le paramètre channelSettings au constructeur SendMessageChannelCache initialisé avec une instance ChannelCacheSettings ayant 0 comme valeur MaxItemsInCache. L’exemple de code suivant montre ceci.
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);
Dans un service de flux de travail hébergé, vous pouvez spécifier les paramètres de cache d’usine et de cache de canal dans le fichier de configuration de l’application. Pour cela, ajoutez un comportement de service qui contient les paramètres des caches de la fabrique et de canaux et ajoutez-le à votre service. L’exemple suivant montre le contenu d’un fichier de configuration qui contient le comportement du service avec les MyChannelCacheBehavior paramètres de cache d’usine et de cache de canal personnalisés. Ce comportement de service est ajouté au service via l’attribut 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>