Gönderme İşlemleri için Önbellek Paylaşımı Düzeylerini Değiştirme

Uzantı SendMessageChannelCache , önbellek paylaşım düzeylerini, kanal fabrikası önbelleği ayarlarını ve mesajlaşma etkinliklerini kullanarak Send hizmet uç noktalarına ileti gönderen iş akışları için kanal önbelleği ayarlarını özelleştirmenizi sağlar. Bu iş akışları genellikle istemci iş akışlarıdır ancak içinde barındırılan iş akışı Hizmetleri ayrıca olabilir bir WorkflowServiceHost. Kanal fabrikası önbelleği önbelleğe alınmış ChannelFactory<TChannel> nesneler içerir. Kanal önbelleği önbelleğe alınmış kanallar içerir.

Not

İş akışları, ileti veya parametre göndermek için mesajlaşma etkinliklerini kullanabilir Send . İş akışı çalışma zamanı, bir etkinlikle Send bir etkinlik kullandığınızda ve IOutputChannel yalnızca Send bir etkinlik kullanırken ReceiveReply (hayırReceiveReply) türünde kanallar oluşturan kanal fabrikalarını IRequestChannel önbelleğe ekler.

Önbellek Paylaşım Düzeyleri

Varsayılan olarak, mesajlaşma etkinlikleri tarafından kullanılan bir önbellek tarafından Send barındırılan bir WorkflowServiceHost iş akışında WorkflowServiceHost , içindeki tüm iş akışı örnekleri arasında paylaşılır (konak düzeyinde önbelleğe alma). Tarafından barındırılmadığında bir istemci iş akışı için bir WorkflowServiceHost, önbelleğe yalnızca (örnek düzeyi önbelleğe alma) iş akışı örneği için kullanılabilir. Önbellek yalnızca güvenli olmayan önbelleğe alma etkinleştirilmediği sürece yapılandırmada tanımlanan uç noktaları kullanmayan etkinlikler için Send kullanılabilir.

Bir iş akışındaki etkinlikler için Send kullanılabilen farklı önbellek paylaşım düzeyleri ve bunların önerilen kullanımı aşağıdadır:

  • Konak Düzeyi: Konak paylaşım düzeyinde önbellek yalnızca iş akışı hizmeti ana bilgisayarında barındırılan iş akışı örnekleri için kullanılabilir. Önbellek, işlem genelindeki bir önbellekteki iş akışı hizmeti konakları arasında da paylaşılabilir.

  • Örnek Düzeyi: Örnek paylaşım düzeyinde, önbellek ömrü boyunca belirli bir iş akışı örneğinde kullanılabilir ancak önbellek diğer iş akışı örnekleri tarafından kullanılamaz.

  • Önbellek Yok: Yapılandırmada tanımlanan uç noktaları kullanan bir iş akışınız varsa önbellek varsayılan olarak kapalıdır. Bu durumda önbelleği açmak güvenli olmadığından önbelleğin kapalı tutulması da önerilir. Örneğin, her gönderme için farklı bir kimlik (farklı kimlik bilgileri veya kimliğe bürünme kullanma) gerekiyorsa.

İstemci İş Akışı için Önbellek Paylaşım Düzeyini Değiştirme

İstemci iş akışında önbellek paylaşımını ayarlamak için, istenen iş akışı örneği kümesine uzantı olarak sınıfının bir örneğini SendMessageChannelCache ekleyin. Bu, önbelleğin tüm iş akışı örnekleri arasında paylaşılmasıyla sonuçlanmaktadır. Aşağıdaki kod örnekleri, bu adımların nasıl gerçekleştirileceğini gösterir.

İlk olarak, türünün SendMessageChannelCachebir örneğini bildirin.

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

Ardından önbellek uzantısını her istemci iş akışı örneğine ekleyin.

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

Barındırılan İş Akışı Hizmeti için Önbellek Paylaşım Düzeyini Değiştirme

Barındırılan bir iş akışı hizmetinde önbellek paylaşımını ayarlamak için, sınıfın SendMessageChannelCache bir örneğini tüm iş akışı hizmeti konaklarına uzantı olarak ekleyin. Bu, önbelleğin tüm iş akışı hizmeti konakları arasında paylaşılmasıyla sonuçlanmaktadır. Aşağıdaki kod örneklerde bu adımların gerçekleştirilmesi gösterilmektedir.

İlk olarak, sınıf düzeyinde türünün SendMessageChannelCache bir örneğini bildirin.

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

Ardından, statik önbellek uzantısını her iş akışı hizmeti konağına ekleyin.

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

Barındırılan bir iş akışı hizmetinde önbellek paylaşımını örnek düzeyine ayarlamak için, iş akışı hizmeti konağına uzantı olarak bir Func<SendMessageChannelCache> temsilci ekleyin ve bu temsilciyi sınıfın yeni bir örneğini oluşturan koda atayın SendMessageChannelCache . Bu, iş akışı hizmeti konağındaki tüm iş akışı örnekleri tarafından paylaşılan tek bir önbellek yerine her bir iş akışı örneği için farklı bir önbellek elde eder. Aşağıdaki kod örneği, temsilcinin işaret ettiği uzantıyı doğrudan tanımlamak SendMessageChannelCache için bir lambda ifadesi kullanarak bunun nasıl başarılacağını gösterir.

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

Önbellek Ayarlar Özelleştirme

Kanal fabrikası önbelleği ve kanal önbelleği için önbellek ayarlarını özelleştirebilirsiniz. Önbellek ayarları sınıfında ChannelCacheSettings tanımlanır. sınıfı, SendMessageChannelCache kanal fabrikası önbelleği için varsayılan önbellek ayarlarını ve parametresiz oluşturucusunda kanal önbelleğini tanımlar. Aşağıdaki tabloda, her önbellek türü için bu önbellek ayarlarının varsayılan değerleri listelemektedir.

Ayarlar LeaseTimeout (dk) IdleTimeout (dk) MaxItemsInCache
Fabrika Önbelleği Varsayılanı TimeSpan.MaxValue 2 16
Kanal Önbelleği Varsayılanı 5 2 16

Fabrika önbelleği ve kanal önbelleği ayarlarını özelleştirmek için parametreli oluşturucuyu SendMessageChannelCache kullanarak sınıfın örneğini SendMessageChannelCache oluşturun ve ve channelSettings parametrelerinin her birine özel değerlerle öğesinin factorySettings yeni bir örneğini ChannelCacheSettings geçirin. Ardından, bu sınıfın yeni örneğini bir iş akışı hizmeti konağına veya iş akışı örneğine uzantı olarak ekleyin. Aşağıdaki kod örneği, bir iş akışı örneği için bu adımların nasıl gerçekleştirileceklerini gösterir.

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

İş akışı hizmetinizde yapılandırmada tanımlanmış uç noktalar olduğunda önbelleğe almayı etkinleştirmek için parametresi olarak ayarlanmış parametreli oluşturucuyu SendMessageChannelCache kullanarak sınıfın allowUnsafeCaching örneğini SendMessageChannelCachetrueoluşturun. Ardından, bu sınıfın yeni örneğini bir iş akışı hizmeti konağına veya iş akışı örneğine uzantı olarak ekleyin. Aşağıdaki kod örneği, bir iş akışı örneği için önbelleğe almayı etkinleştirmeyi gösterir.

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

Kanal fabrikaları ve kanallar için önbelleği tamamen devre dışı bırakmak için kanal fabrikası önbelleğini devre dışı bırakın. Bunun yapılması, kanallar ilgili kanal fabrikalarına ait olduğundan kanal önbelleğini de kapatır. Kanal fabrikası önbelleğini devre dışı bırakmak için parametresini factorySettings 0 değerine sahip MaxItemsInCache bir ChannelCacheSettings örneğe başlatılan oluşturucuya geçirin.SendMessageChannelCache Aşağıdaki kod örneği bunu gösterir.

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

Parametresini 0 değerine sahip MaxItemsInCache bir ChannelCacheSettings örneğe başlatılan oluşturucuya SendMessageChannelCache geçirerek channelSettings yalnızca kanal fabrikası önbelleğini kullanmayı ve kanal önbelleğini devre dışı bırakabilirsiniz. Aşağıdaki kod örneği bunu gösterir.

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

Barındırılan iş akışı hizmetinde, uygulama yapılandırma dosyasında üreteci önbellek ve kanal önbellek ayarları belirtebilirsiniz. Bunu yapmak için üretecini ve kanal önbellek için önbellek ayarlarını içeren bir hizmet davranışını ekleyin ve bu hizmet davranışını hizmetinize ekleyin. Aşağıdaki örnek, özel fabrika önbelleği ve kanal önbelleği ayarlarıyla hizmet davranışını içeren MyChannelCacheBehavior bir yapılandırma dosyasının içeriğini gösterir. Bu hizmet davranışı, özniteliği aracılığıyla behaviorConfiguration hizmete eklenir.

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