De niveaus voor het delen van caches wijzigen voor verzendactiviteiten
Met SendMessageChannelCache de extensie kunt u de niveaus voor het delen van caches, de instellingen van de cache van de kanaalfactory en de instellingen van de kanaalcache aanpassen voor werkstromen die berichten verzenden naar service-eindpunten met behulp van Send berichtenactiviteiten. Deze werkstromen zijn doorgaans clientwerkstromen, maar kunnen ook werkstroomservices zijn die worden gehost in een WorkflowServiceHost. De cache van de kanaalfactory bevat objecten ChannelFactory<TChannel> in de cache. De kanaalcache bevat kanalen in de cache.
Notitie
Werkstromen kunnen berichtenactiviteiten gebruiken Send om berichten of parameters te verzenden. De werkstroomruntime voegt kanaalfactory's toe aan de cache die kanalen van het type IRequestChannel maken wanneer u een activiteit met een ReceiveReplySend activiteit gebruikt, en een IOutputChannel wanneer u alleen een Send activiteit (nee ReceiveReply) gebruikt.
De niveaus voor het delen van caches
Standaard wordt in een werkstroom die wordt gehost door een WorkflowServiceHost cache die wordt gebruikt door Send berichtenactiviteiten gedeeld in alle werkstroomexemplaren in de WorkflowServiceHost cache (caching op hostniveau). Voor een clientwerkstroom die niet wordt gehost door een WorkflowServiceHost, is de cache alleen beschikbaar voor het werkstroomexemplaren (caching op exemplaarniveau). De cache is alleen beschikbaar voor Send activiteiten die geen eindpunten gebruiken die zijn gedefinieerd in de configuratie, tenzij onveilige caching is ingeschakeld.
Hier volgen de verschillende niveaus voor het delen van caches die beschikbaar zijn voor Send activiteiten in een werkstroom en hun aanbevolen gebruik:
Hostniveau: Op hostniveau is de cache alleen beschikbaar voor de werkstroomexemplaren die worden gehost op de host van de werkstroomservice. Een cache kan ook worden gedeeld tussen werkstroomservicehosts in een procesbrede cache.
Instantieniveau: In het niveau van het delen van exemplaren is de cache gedurende de gehele levensduur beschikbaar voor een bepaald werkstroomexemplaren, maar is de cache niet beschikbaar voor andere werkstroomexemplaren.
Geen cache: de cache is standaard uitgeschakeld als u een werkstroom hebt die gebruikmaakt van eindpunten die zijn gedefinieerd in de configuratie. Het wordt ook aanbevolen om de cache in dit geval uitgeschakeld te houden, omdat het inschakelen mogelijk onbeveiligd is. Als bijvoorbeeld een andere identiteit (verschillende referenties of imitatie) is vereist voor elke verzendfunctie.
Het niveau voor het delen van caches voor een clientwerkstroom wijzigen
Als u het delen van de cache in een clientwerkstroom wilt instellen, voegt u een exemplaar van de SendMessageChannelCache klasse toe als een extensie aan de gewenste set werkstroomexemplaren. Dit resulteert in het delen van de cache in alle werkstroomexemplaren. In de volgende codevoorbeelden ziet u hoe u deze stappen uitvoert.
Declareer eerst een exemplaar van het type SendMessageChannelCache.
// Create an instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension =
new SendMessageChannelCache();
Voeg vervolgens de cache-extensie toe aan elk clientwerkstroomexemplaren.
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);
Het niveau voor het delen van caches voor een gehoste werkstroomservice wijzigen
Als u het delen van de cache in een gehoste werkstroomservice wilt instellen, voegt u een exemplaar van de SendMessageChannelCache klasse toe als een extensie voor alle werkstroomservicehosts. Dit resulteert in het delen van de cache op alle werkstroomservicehosts. In de volgende codevoorbeelden ziet u hoe u deze stappen kunt uitvoeren.
Declareer eerst een exemplaar van het type SendMessageChannelCache op klasseniveau.
// Create static instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension = new
SendMessageChannelCache();
Voeg vervolgens de statische cache-extensie toe aan elke werkstroomservicehost.
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);
Als u het delen van caches in een gehoste werkstroomservice wilt instellen op exemplaarniveau, voegt u een Func<SendMessageChannelCache>
gemachtigde toe als een extensie aan de host van de werkstroomservice en wijst u deze gemachtigde toe aan de code waarmee een nieuw exemplaar van de SendMessageChannelCache klasse wordt geïnstitueerd. Dit resulteert in een andere cache voor elk afzonderlijk werkstroomexemplaren in plaats van één cache die wordt gedeeld door alle werkstroomexemplaren in de host van de werkstroomservice. In het volgende codevoorbeeld ziet u hoe u dit kunt bereiken met behulp van een lambda-expressie om rechtstreeks de SendMessageChannelCache extensie te definiëren waarnaar de gemachtigde verwijst.
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 },
});
Cache-Instellingen aanpassen
U kunt de cache-instellingen voor de cache van de kanaalfactory en de kanaalcache aanpassen. De cache-instellingen worden gedefinieerd in de ChannelCacheSettings klasse. De SendMessageChannelCache klasse definieert standaardcache-instellingen voor de cache van de kanaalfactory en de kanaalcache in de parameterloze constructor. De volgende tabel bevat de standaardwaarden van deze cache-instellingen voor elk type cache.
Instellingen | LeaseTimeout (min. | IdleTimeout (min. | MaxItemsInCache |
---|---|---|---|
Standaardinstelling fabriekscache | TimeSpan.MaxValue | 2 | 16 |
Standaard kanaalcache | 5 | 2 | 16 |
Als u de instellingen voor de factorycache en kanaalcache wilt aanpassen, instantieert u de SendMessageChannelCache klasse met behulp van de geparameteriseerde constructor SendMessageChannelCache en geeft u een nieuw exemplaar van de ChannelCacheSettings met aangepaste waarden door aan elk van de factorySettings
en channelSettings
parameters. Voeg vervolgens het nieuwe exemplaar van deze klasse toe als een extensie aan een werkstroomservicehost of een werkstroomexemplaren. In het volgende codevoorbeeld ziet u hoe u deze stappen uitvoert voor een werkstroomexemplaren.
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);
Als u caching wilt inschakelen wanneer uw werkstroomservice eindpunten heeft gedefinieerd in de configuratie, instantieert u de SendMessageChannelCache klasse met behulp van de geparameteriseerde constructor SendMessageChannelCache met de allowUnsafeCaching
parameter die is ingesteld op true
. Voeg vervolgens het nieuwe exemplaar van deze klasse toe als een extensie aan een werkstroomservicehost of een werkstroomexemplaren. In het volgende codevoorbeeld ziet u hoe u caching inschakelt voor een werkstroomexemplaren.
SendMessageChannelCache customChannelCacheExtension =
new SendMessageChannelCache{ AllowUnsafeCaching = true };
clientInstance.Extensions.Add(customChannelCacheExtension);
Als u de cache volledig wilt uitschakelen voor de kanaalfactory's en de kanalen, schakelt u de cache van de kanaalfactory uit. Als u dit doet, wordt ook de kanaalcache uitgeschakeld omdat de kanalen eigendom zijn van de bijbehorende kanaalfactory's. Als u de cache van de kanaalfactory wilt uitschakelen, geeft u de factorySettings
parameter door aan de SendMessageChannelCache constructor die is geïnitialiseerd naar een ChannelCacheSettings exemplaar met de MaxItemsInCache waarde 0. In het volgende codevoorbeeld ziet u dit.
// 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);
U kunt ervoor kiezen alleen de cache van de kanaalfactory te gebruiken en de kanaalcache uit te schakelen door de channelSettings
parameter door te geven aan de SendMessageChannelCache constructor die is geïnitialiseerd aan een ChannelCacheSettings exemplaar met de MaxItemsInCache waarde 0. In het volgende codevoorbeeld ziet u dit.
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 een gehoste werkstroomservice kunt u de instellingen voor de factorycache en kanaalcache opgeven in het configuratiebestand van de toepassing. Hiervoor voegt u een servicegedrag toe dat de cache-instellingen voor de factory- en kanaalcache bevat en voegt u dit servicegedrag toe aan uw service. In het volgende voorbeeld ziet u de inhoud van een configuratiebestand dat het MyChannelCacheBehavior
servicegedrag bevat met de instellingen voor de aangepaste factorycache en kanaalcache. Dit servicegedrag wordt via het behaviorConfiguration
kenmerk aan de service toegevoegd.
<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>