다음을 통해 공유


보내기 활동에 대한 캐시 공유 수준 변경

확장을 SendMessageChannelCache 사용하면 메시징 활동을 사용하여 Send 서비스 엔드포인트에 메시지를 보내는 워크플로에 대한 캐시 공유 수준, 채널 팩터리 캐시 설정 및 채널 캐시 설정을 사용자 지정할 수 있습니다. 이러한 워크플로는 일반적으로 클라이언트 워크플로이지만 에 WorkflowServiceHost호스트되는 워크플로 서비스일 수도 있습니다. 채널 팩터리 캐시에는 캐시된 개체가 ChannelFactory<TChannel> 포함됩니다. 채널 캐시에는 캐시된 채널이 포함됩니다.

비고

워크플로는 메시징 활동을 사용하여 Send 메시지 또는 매개 변수를 보낼 수 있습니다. 워크플로 런타임은 IRequestChannel 활동과 ReceiveReply 활동을 함께 사용할 때 형식 Send의 채널을 만드는 채널 팩터리를 캐시에 추가하고, IOutputChannel 없이 Send 활동만 사용할 때 ReceiveReply을 추가합니다.

캐시 공유 수준

기본적으로 WorkflowServiceHost에 의해 호스팅되는 워크플로에서 Send 메시징 활동에 사용되는 캐시는 WorkflowServiceHost의 모든 워크플로 인스턴스 간에 공유됩니다 (호스트 수준 캐싱). 호스트되지 않는 WorkflowServiceHost클라이언트 워크플로의 경우 캐시는 워크플로 인스턴스(인스턴스 수준 캐싱)에서만 사용할 수 있습니다. 안전하지 않은 캐싱을 사용하지 않는 한 구성에 정의된 엔드포인트를 사용하지 않는 활동에만 캐시를 사용할 수 Send 있습니다.

다음은 워크플로의 활동에 사용할 수 있는 Send 다양한 캐시 공유 수준과 권장되는 용도입니다.

  • 호스트 수준: 호스트 공유 수준에서 캐시는 워크플로 서비스 호스트에서 호스트되는 워크플로 인스턴스에서만 사용할 수 있습니다. 프로세스 전체 캐시의 워크플로 서비스 호스트 간에 캐시를 공유할 수도 있습니다.

  • 인스턴스 수준: 인스턴스 공유 수준에서 캐시는 수명 동안 특정 워크플로 인스턴스에서 사용할 수 있지만 다른 워크플로 인스턴스에서는 캐시를 사용할 수 없습니다.

  • 캐시 없음: 구성에 정의된 엔드포인트를 사용하는 워크플로가 있는 경우 캐시가 기본적으로 꺼집니다. 또한 이 경우 캐시를 켜는 것이 안전하지 않을 수 있으므로 캐시를 해제된 상태로 유지하는 것이 좋습니다. 예를 들어 각 전송에 다른 정체성(다른 자격 증명 또는 가장하여 사용)이 필요한 경우입니다.

클라이언트 워크플로의 캐시 공유 수준 변경

클라이언트 워크플로에서 캐시 공유를 설정하려면 원하는 워크플로 인스턴스 집합에 SendMessageChannelCache 확장으로 클래스 인스턴스를 추가합니다. 그러면 모든 워크플로 인스턴스에서 캐시를 공유하게 됩니다. 다음 코드 예제에서는 이러한 단계를 수행하는 방법을 보여 줍니다.

먼저 형식의 인스턴스를 선언합니다 SendMessageChannelCache.

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

다음으로, 각 클라이언트 워크플로 인스턴스에 캐시 확장을 추가합니다.

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

호스트된 워크플로 서비스의 캐시 공유 수준 변경

호스트된 워크플로 서비스에서 캐시 공유를 설정하려면 클래스의 인스턴스를 SendMessageChannelCache 모든 워크플로 서비스 호스트에 확장으로 추가합니다. 그러면 모든 워크플로 서비스 호스트에서 캐시를 공유하게 됩니다. 다음 코드 예제에서는 이러한 단계를 수행하는 방법을 보여 줍니다.

먼저 클래스 수준에서 형식 SendMessageChannelCache 의 인스턴스를 선언합니다.

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

다음으로, 각 워크플로 서비스 호스트에 정적 캐시 확장을 추가합니다.

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

호스트된 워크플로 서비스의 캐시 공유를 인스턴스 수준으로 설정하려면 대리자를 워크플로 서비스 호스트에 확장으로 추가하고 Func<SendMessageChannelCache> 이 대리자를 클래스의 새 인스턴스를 인스턴스화하는 코드에 SendMessageChannelCache 할당합니다. 이로 인해 워크플로 서비스 호스트의 모든 워크플로 인스턴스에서 공유하는 단일 캐시 대신 각 개별 워크플로 인스턴스에 대해 다른 캐시가 생성됩니다. 다음 코드 예제는 대리자가 가리키는 SendMessageChannelCache 확장을 직접 정의하기 위해 람다 식을 사용하는 방법을 보여줍니다.

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

캐시 설정 사용자 지정

채널 팩터리 캐시 및 채널 캐시에 대한 캐시 설정을 사용자 지정할 수 있습니다. 캐시 설정은 클래스에 ChannelCacheSettings 정의됩니다. 이 클래스는 SendMessageChannelCache 채널 팩터리 캐시에 대한 기본 캐시 설정과 매개 변수가 없는 생성자의 채널 캐시를 정의합니다. 다음 표에서는 각 캐시 유형에 대한 이러한 캐시 설정의 기본값을 나열합니다.

설정 LeaseTimeout (분) IdleTimeout(분) 캐시의 최대 항목 수
팩터리 캐시 기본값 TimeSpan.MaxValue 2 16
채널 캐시 기본값 5 2 16

팩터리 캐시 및 채널 캐시 설정을 사용자 지정하려면 매개 변수가 있는 생성자를 SendMessageChannelCache 사용하여 클래스를 인스턴스화 SendMessageChannelCache 하고 사용자 지정 값을 가진 새 인스턴스 ChannelCacheSettings 를 각 및 factorySettings 매개 변수에 channelSettings 전달합니다. 다음으로, 이 클래스의 새 인스턴스를 워크플로 서비스 호스트 또는 워크플로 인스턴스에 대한 확장으로 추가합니다. 다음 코드 예제에서는 워크플로 인스턴스에 대해 이러한 단계를 수행하는 방법을 보여 줍니다.

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

구성에 정의된 엔드포인트가 있는 워크플로 서비스에서 캐싱을 사용하도록 설정하려면, 매개변수가 있는 생성자 SendMessageChannelCache을 사용해 SendMessageChannelCache 클래스를 allowUnsafeCaching 파라미터로 인스턴스화하십시오. 다음으로, 이 클래스의 새 인스턴스를 워크플로 서비스 호스트 또는 워크플로 인스턴스에 대한 확장으로 추가합니다. 다음 코드 예제에서는 워크플로 인스턴스에 캐싱을 사용하도록 설정하는 방법을 보여 줍니다.

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

채널 팩터리 및 채널에 대해 캐시를 완전히 사용하지 않도록 설정하려면 채널 팩터리 캐시를 사용하지 않도록 설정합니다. 이렇게 하면 채널이 해당 채널 팩터리에서 소유하므로 채널 캐시도 꺼집니다. 채널 팩터리 캐시를 사용하지 않도록 설정하려면 factorySettings 값이 0인 SendMessageChannelCache 인스턴스로 초기화된 생성자에 ChannelCacheSettings 매개 변수를 MaxItemsInCache로 전달합니다. 다음 코드 예제에서는 이를 보여줍니다.

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

channelSettings 매개변수를 값이 0인 SendMessageChannelCache 인스턴스로 초기화된 ChannelCacheSettings 생성자에 전달하여, 채널 팩토리 캐시만 사용하고 채널 캐시는 비활성화하도록 선택할 수 있습니다. 다음 코드 예제에서는 이를 보여줍니다.

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

호스트된 워크플로 서비스에서 애플리케이션 구성 파일에서 팩터리 캐시 및 채널 캐시 설정을 지정할 수 있습니다. 이렇게 하려면 팩터리 및 채널 캐시에 대한 캐시 설정이 포함된 서비스 동작을 추가하고 이 서비스 동작을 서비스에 추가합니다. 다음 예제에서는 사용자 지정 팩터리 캐시 및 채널 캐시 설정을 사용하여 서비스 동작을 MyChannelCacheBehavior 포함하는 구성 파일의 내용을 보여 줍니다. 서비스 동작은 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>