Změna úrovní sdílení mezipaměti pro aktivity odesílání

Toto SendMessageChannelCache rozšíření umožňuje přizpůsobit úrovně sdílení mezipaměti, nastavení mezipaměti továrny kanálu a nastavení mezipaměti kanálu pro pracovní postupy, které odesílají zprávy do koncových bodů služby pomocí Send aktivit zasílání zpráv. Tyto pracovní postupy jsou obvykle pracovní postupy klienta, ale mohou být také služby pracovního postupu, které jsou hostovány v WorkflowServiceHost. Mezipaměť objektu pro vytváření kanálů obsahuje objekty uložené v ChannelFactory<TChannel> mezipaměti. Mezipaměť kanálu obsahuje kanály uložené v mezipaměti.

Poznámka:

Pracovní postupy můžou používat Send aktivity zasílání zpráv k odesílání zpráv nebo parametrů. Modul runtime pracovního postupu přidá objekty pro vytváření kanálů do mezipaměti, které vytvářejí kanály typu při použití ReceiveReply aktivity s aktivitou Send a IOutputChannel při použití Send aktivity (neReceiveReply).IRequestChannel

Úrovně sdílení mezipaměti

Ve výchozím nastavení se v pracovním postupu hostovaným WorkflowServiceHost mezi mezipamětí používanými aktivitami Send zasílání zpráv sdílí všechny instance pracovního postupu v WorkflowServiceHost mezipaměti (ukládání do mezipaměti na úrovni hostitele). Pro klienta pracovní postup, který není hostované WorkflowServiceHost, mezipaměť je k dispozici pouze pro instanci pracovního postupu (ukládání do mezipaměti na úrovni instance). Mezipaměť je k dispozici pouze pro Send aktivity, které nepoužívají koncové body definované v konfiguraci, pokud není povolené nebezpečné ukládání do mezipaměti.

Níže jsou uvedené různé úrovně sdílení mezipaměti dostupné pro Send aktivity v pracovním postupu a jejich doporučené použití:

  • Úroveň hostitele: Na úrovni sdílení hostitelů je mezipaměť k dispozici pouze pro instance pracovního postupu hostované v hostiteli služby pracovního postupu. Mezipaměť lze také sdílet mezi hostiteli služby pracovního postupu v mezipaměti v rámci celého procesu.

  • Úroveň instance: V úrovni sdílení instance je mezipaměť dostupná pro konkrétní instanci pracovního postupu po celou dobu jeho životnosti, ale mezipaměť není k dispozici pro jiné instance pracovního postupu.

  • Žádná mezipaměť: Mezipaměť je ve výchozím nastavení vypnutá, pokud máte pracovní postup, který používá koncové body definované v konfiguraci. V tomto případě se také doporučuje ponechat mezipaměť vypnutou, protože zapnutí může být nezabezpečené. Pokud se například pro každé odeslání vyžaduje jiná identita (jiné přihlašovací údaje nebo použití zosobnění).

Změna úrovně sdílení mezipaměti pro pracovní postup klienta

Pokud chcete nastavit sdílení mezipaměti v pracovním postupu klienta, přidejte instanci SendMessageChannelCache třídy jako rozšíření do požadované sady instancí pracovního postupu. Výsledkem je sdílení mezipaměti napříč všemi instancemi pracovního postupu. Následující příklady kódu ukazují, jak tyto kroky provést.

Nejprve deklarujte instanci typu SendMessageChannelCache.

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

Dále přidejte rozšíření mezipaměti do každé instance pracovního postupu klienta.

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

Změna úrovně sdílení mezipaměti pro službu hostovaného pracovního postupu

Pokud chcete nastavit sdílení mezipaměti ve službě hostovaného pracovního postupu, přidejte instanci SendMessageChannelCache třídy jako rozšíření pro všechny hostitele služby pracovního postupu. Výsledkem je sdílení mezipaměti mezi všemi hostiteli služby pracovního postupu. Následující příklady kódu ukazují, jak tyto kroky provést.

Nejprve deklarujte instanci typu SendMessageChannelCache na úrovni třídy.

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

Dále přidejte rozšíření statické mezipaměti do každého hostitele služby pracovního postupu.

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

Pokud chcete nastavit sdílení mezipaměti ve službě hostovaného pracovního postupu na úroveň instance, přidejte delegáta Func<SendMessageChannelCache> jako rozšíření hostitele služby pracovního postupu a přiřaďte tohoto delegáta kódu, který vytvoří instanci nové instance SendMessageChannelCache třídy. Výsledkem je jiná mezipaměť pro každou instanci pracovního postupu místo jedné mezipaměti sdílené všemi instancemi pracovního postupu v hostiteli služby pracovního postupu. Následující příklad kódu ukazuje, jak toho dosáhnout pomocí výrazu lambda k přímému SendMessageChannelCache definování rozšíření, na které delegát odkazuje.

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

Přizpůsobení Nastavení mezipaměti

Nastavení mezipaměti pro mezipaměť kanálu a mezipaměť kanálu můžete přizpůsobit. Nastavení mezipaměti jsou definována ChannelCacheSettings ve třídě. Třída SendMessageChannelCache definuje výchozí nastavení mezipaměti pro mezipaměť objektu pro vytváření kanálů a mezipaměť kanálu v jeho konstruktoru bez parametrů. Následující tabulka uvádí výchozí hodnoty těchto nastavení mezipaměti pro každý typ mezipaměti.

Nastavení Zapůjčení (min.) IdleTimeout (min) MaxItemsInCache
Výchozí mezipaměť továrny Timespan.maxvalue 2 16
Výchozí mezipaměť kanálu 5 2 16

Pokud chcete přizpůsobit nastavení mezipaměti továrny a mezipaměti kanálu, vytvořte SendMessageChannelCache instanci třídy pomocí parametrizovaného konstruktoru SendMessageChannelCache a předejte novou instanci ChannelCacheSettings s vlastními hodnotami každému z factorySettings parametrů.channelSettings Dále přidejte novou instanci této třídy jako rozšíření do hostitele služby pracovního postupu nebo instance pracovního postupu. Následující příklad kódu ukazuje, jak provést tyto kroky pro instanci pracovního postupu.

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

Pokud chcete povolit ukládání do mezipaměti, pokud má služba pracovního postupu definované koncové body v konfiguraci, vytvořte instanci SendMessageChannelCache třídy pomocí parametrizovaného konstruktoru SendMessageChannelCache s parametrem nastaveným allowUnsafeCaching na true. Dále přidejte novou instanci této třídy jako rozšíření do hostitele služby pracovního postupu nebo instance pracovního postupu. Následující příklad kódu ukazuje, jak povolit ukládání do mezipaměti pro instanci pracovního postupu.

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

Pokud chcete mezipaměť úplně zakázat pro továrny kanálů a kanály, zakažte mezipaměť objektu pro vytváření kanálů. Tím také vypnete mezipaměť kanálu, protože kanály vlastní odpovídající továrny kanálů. Pokud chcete zakázat mezipaměť továrny kanálu, předejte factorySettings parametr SendMessageChannelCache konstruktoru inicializované instanci ChannelCacheSettings s MaxItemsInCache hodnotou 0. Následující příklad kódu ukazuje toto.

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

Můžete se rozhodnout použít pouze mezipaměť objektu pro vytváření kanálů a zakázat mezipaměť kanálu předáním channelSettings parametru SendMessageChannelCache konstruktoru inicializované instanci ChannelCacheSettings s MaxItemsInCache hodnotou 0. Následující příklad kódu ukazuje toto.

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

V služby hostované pracovního postupu můžete určit nastavení objekt pro vytváření mezipaměti a kanál mezipaměti v konfiguračním souboru aplikace. Chcete-li to provést, přidejte chování služby, který obsahuje nastavení mezipaměti pro objekt pro vytváření a kanál mezipaměti a ke službě Toto chování služby. Následující příklad ukazuje obsah konfiguračního souboru, který obsahuje MyChannelCacheBehavior chování služby s nastavením mezipaměti vlastní továrny a mezipaměti kanálu. Toto chování služby se přidá do služby prostřednictvím atributu 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>