Delen via


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 gecachete kanalen.

Opmerking

Werkstromen kunnen Send berichtenactiviteiten gebruiken om berichten of parameters te verzenden. De workflowruntime voegt kanaalfabrieken toe aan de cache die kanalen van het type IRequestChannel maken wanneer u een ReceiveReply-activiteit samen met een Send-activiteit gebruikt, en een IOutputChannel wanneer u alleen een Send-activiteit gebruikt (geen ReceiveReply).

De niveaus voor het delen van caches

Standaard wordt in een werkstroom die wordt gehost door een WorkflowServiceHost, de cache die door Send berichtenactiviteiten wordt gebruikt, gedeeld tussen alle werkstroomexemplaren in de WorkflowServiceHost (hostniveau caching). Voor een werkstroom die niet wordt gehost door een WorkflowServiceHost, is de cache alleen beschikbaar voor het werkstroomexemplaar (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 inloggegevens of het gebruik van imitatie) vereist is voor elke verzending.

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 de cache-extensie toe aan elk clientwerkstroomexemplaar.

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) Inactiviteitsperiode (min) MaxItemsInCache (MaximaleItemsInCache)
Fabriekscache Standaard 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 werkstroomservice-host of een werkstroominstantie. Het volgende codevoorbeeld laat zien hoe u deze stappen uitvoert voor een werkstroominstantie.

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 werkstroomservice-host of een werkstroominstantie. In het volgende voorbeeld van code ziet u hoe u caching inschakelt voor een werkstroominstantie.

SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache{ AllowUnsafeCaching = true };

clientInstance.Extensions.Add(customChannelCacheExtension);

Als u de cache volledig wilt uitschakelen voor de kanaalfabrieken en de kanalen, schakelt u de cache van de kanaalfabriek uit. Als u dit doet, wordt ook de kanaalcache uitgeschakeld, omdat de kanalen eigendom zijn van de bijbehorende kanaalfabrieken. Als u de cache van de kanaalfactory wilt uitschakelen, geeft u de factorySettings parameter door aan de SendMessageChannelCache constructor die is geïnitialiseerd als een ChannelCacheSettings exemplaar met een MaxItemsInCache waarde van 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 met 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>