Freigeben über


Ändern der Cachefreigabeebenen für Sendeaktivitäten

Die SendMessageChannelCache-Erweiterung ermöglicht es Ihnen, die Cache-Freigabeebenen, die Einstellungen des Channel-Factory-Caches und die Einstellungen des Channel-Caches für Workflows anzupassen, die Nachrichten mithilfe von Send-Messagingaktivitäten an Dienstendpunkte senden. Diese Workflows sind in der Regel Client-Workflows, können aber auch Workflow-Dienste sein, die in einer WorkflowServiceHost gehostet werden. Der Kanalfactorycache enthält zwischengespeicherte ChannelFactory<TChannel>-Objekte. Der Kanalcache enthält zwischengespeicherte Kanäle.

Hinweis

Workflows können Nachrichtenaktivitäten verwenden Send , um Nachrichten oder Parameter zu senden. Die Workflowlaufzeit fügt Kanalfabriken zum Cache hinzu, die Kanäle vom Typ IRequestChannel erstellen, wenn Sie eine ReceiveReply-Aktivität mit einer Send-Aktivität verwenden, und einen IOutputChannel, wenn Sie nur eine Send-Aktivität verwenden (kein ReceiveReply).

Die Cachefreigabeebenen

In einem von einem WorkflowServiceHost gehosteten Workflow wird der von Send-Messagingaktivitäten verwendete Cache von allen Workflowinstanzen auf dem WorkflowServiceHost gemeinsam genutzt (Zwischenspeicherung auf Hostebene). Für einen Clientworkflow, der nicht von einem WorkflowServiceHostClient gehostet wird, ist der Cache nur für die Workflowinstanz (Zwischenspeicherung auf Instanzebene) verfügbar. Der Cache ist nur für Send Aktivitäten verfügbar, die in der Konfiguration definierte Endpunkte nicht verwenden, es sei denn, die unsichere Zwischenspeicherung ist aktiviert.

Im Folgenden sind die verschiedenen Cachefreigabeebenen aufgeführt, die für Send Aktivitäten in einem Workflow und deren empfohlene Verwendung verfügbar sind:

  • Hostebene: Auf der Hostfreigabeebene ist der Cache nur für die Workflowinstanzen verfügbar, die im Workflowdiensthost gehostet werden. Ein Cache kann auch prozessweit für mehrere Workflowdiensthosts freigegeben werden.

  • Instanzebene: In der Instanzfreigabeebene ist der Cache für eine bestimmte Workflowinstanz während der gesamten Lebensdauer verfügbar, der Cache ist jedoch für andere Workflowinstanzen nicht verfügbar.

  • Kein Cache: Der Cache ist standardmäßig deaktiviert, wenn Sie über einen Workflow verfügen, der Endpunkte verwendet, die in der Konfiguration definiert sind. Es wird auch empfohlen, den Cache in diesem Fall deaktiviert zu lassen, da das Aktivieren unsicher sein könnte. Beispiel: Wenn eine andere Identität (andere Anmeldeinformationen oder Identitätswechsel) für jeden Sendevorgang benötigt wird.

Ändern der Cachefreigabeebene für einen Clientworkflow

Um die Cachefreigabe in einem Clientworkflow festzulegen, fügen Sie eine Instanz der SendMessageChannelCache Klasse als Erweiterung zur gewünschten Gruppe von Workflowinstanzen hinzu. Dies führt dazu, dass der Cache für alle Workflowinstanzen freigegeben wird. Die folgenden Codebeispiele zeigen, wie Sie diese Schritte ausführen.

Deklarieren Sie zunächst eine Instanz vom Typ SendMessageChannelCache.

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

Fügen Sie als Nächstes die Cacheerweiterung zu jeder Clientworkflowinstanz hinzu.

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

Ändern der Cachefreigabeebene für einen gehosteten Workflowdienst

Um die Cachefreigabe in einem gehosteten Workflowdienst festzulegen, fügen Sie eine Instanz der SendMessageChannelCache Klasse als Erweiterung zu allen Workflowdiensthosts hinzu. Dies führt dazu, dass der Cache für alle Workflowdiensthosts freigegeben wird. Die folgenden Codebeispiele zeigen, wie Sie diese Schritte ausführen können.

Deklarieren Sie zunächst eine Instanz des Typs SendMessageChannelCache auf Klassenebene.

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

Fügen Sie als Nächstes die statische Cacheerweiterung zu jedem Workflowdiensthost hinzu.

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

Um die Cachefreigabe in einem gehosteten Workflowdienst auf Instanzebene festzulegen, fügen Sie dem Workflowdiensthost einen Func<SendMessageChannelCache> Delegaten als Erweiterung hinzu, und weisen Sie diesen Delegaten dem Code zu, der eine neue Instanz der SendMessageChannelCache Klasse instanziiert. Dies führt zu einem anderen Cache für jede einzelne Workflowinstanz anstelle eines einzelnen Caches, der von allen Workflowinstanzen im Workflowdiensthost gemeinsam genutzt wird. Das folgende Codebeispiel zeigt, wie Sie dies mithilfe eines Lambda-Ausdrucks erreichen können, um die SendMessageChannelCache Erweiterung, auf die der Delegat verweist, direkt zu definieren.

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

Anpassen der Cacheeinstellungen

Sie können die Cache-Einstellungen für den Kanal-Factory-Cache und den Kanal-Cache anpassen. Die Cacheeinstellungen werden in der ChannelCacheSettings Klasse definiert. Die SendMessageChannelCache-Klasse enthält Standardcacheeinstellungen für den Kanalfactorycache und den Kanalcache in ihrem parameterlosen Konstruktor. In der folgenden Tabelle sind die Standardwerte dieser Cacheeinstellungen für jeden Cachetyp aufgeführt.

Einstellungen LeaseTimeout (min) IdleTimeout (min) MaxItemsInCache
Standardwert Factorycache TimeSpan.MaxValue 2 16
Standardwert Kanalcache 5 2 16

Um die Einstellungen für den Factorycache und den Kanalcache anzupassen, instanziieren Sie die SendMessageChannelCache Klasse mithilfe des parametrisierten Konstruktors SendMessageChannelCache , und übergeben Sie eine neue Instanz der ChannelCacheSettings mit benutzerdefinierten Werten an die einzelnen factorySettingschannelSettings Parameter. Fügen Sie als Nächstes die neue Instanz dieser Klasse als Erweiterung zu einem Workflowdiensthost oder einer Workflowinstanz hinzu. Das folgende Codebeispiel zeigt, wie Sie diese Schritte für eine Workflowinstanz ausführen.

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

Um die Zwischenspeicherung zu aktivieren, wenn Ihr Workflowdienst Endpunkte in der Konfiguration definiert hat, instanziieren Sie die SendMessageChannelCache Klasse mithilfe des parametrisierten Konstruktors SendMessageChannelCache , auf den der allowUnsafeCaching Parameter festgelegt ist true. Fügen Sie als Nächstes die neue Instanz dieser Klasse als Erweiterung zu einem Workflowdiensthost oder einer Workflowinstanz hinzu. Das folgende Codebeispiel zeigt, wie Sie die Zwischenspeicherung für eine Workflowinstanz aktivieren.

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

Wenn Sie den Cache für die Kanalfactorys und die Kanäle komplett deaktivieren möchten, deaktivieren Sie den Kanalfactorycache. Dadurch wird auch der Kanalcache deaktiviert, da die Kanäle im Besitz dieser entsprechenden Kanalfabriken sind. Um den Cache der Kanalfabrik zu deaktivieren, übergeben Sie den factorySettings-Parameter an den SendMessageChannelCache-Konstruktor, der mit einer ChannelCacheSettings-Instanz initialisiert wurde, die den Wert MaxItemsInCache von 0 hat. Das folgende Codebeispiel zeigt dies.

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

Sie können auch den Kanalfactorycache verwenden und nur den Kanalcache deaktivieren, indem Sie den channelSettings-Parameter an den SendMessageChannelCache-Konstruktor übergeben, initialisiert auf eine ChannelCacheSettings-Instanz mit dem MaxItemsInCache-Wert auf 0 (null). Das folgende Codebeispiel zeigt dies.

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 einem gehosteten Workflowdienst können Sie die Einstellungen für den Factorycache und den Kanalcache in der Anwendungskonfigurationsdatei angeben. Fügen Sie dazu ein Dienstverhalten hinzu, das die Cacheeinstellungen für den Fabrik- und Kanalcache enthält, und integrieren Sie dieses Verhalten in Ihren Dienst. Das folgende Beispiel zeigt den Inhalt einer Konfigurationsdatei, die das MyChannelCacheBehavior Dienstverhalten mit den einstellungen für den benutzerdefinierten Factorycache und kanalcache enthält. Dieses Dienstverhalten wird dem Dienst über das behaviorConfiguration Attribut hinzugefügt.

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