Aracılığıyla paylaş


Kanal Fabrikası ve Önbelleğe Alma

WCF istemci uygulamaları, ChannelFactory<TChannel> wcf hizmetiyle iletişim kanalı oluşturmak için sınıfını kullanır. Örnekleri oluşturmak ChannelFactory<TChannel> , aşağıdaki işlemleri içerdiğinden bazı ek yüklere neden olur:

  • Ağacı oluşturma ContractDescription

  • Tüm gerekli CLR türlerini Düşünceler

  • Kanal yığınını oluşturma

  • Kaynakları yok etme

Bu ek yükü en aza indirmeye yardımcı olmak için WCF, bir WCF istemci proxy'si kullanırken kanal fabrikalarını önbelleğe alabilir.

İpucu

Sınıfı doğrudan kullandığınızda ChannelFactory<TChannel> kanal fabrikası oluşturma üzerinde doğrudan denetiminiz vardır.

ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) ile oluşturulan WCF istemci proxy'leri öğesinden ClientBase<TChannel>türetilir. ClientBase<TChannel> kanal fabrikası önbelleğe alma davranışını tanımlayan statik CacheSetting bir özellik tanımlar. Önbellek ayarları belirli bir tür için yapılır. Örneğin, aşağıda tanımlanan değerlerden birine ayarlanması ClientBase<ITest>.CacheSettings yalnızca türündeki ITestara sunucuyu/ClientBase'i etkiler. Belirli ClientBase<TChannel> bir sunucu için önbellek ayarı, ilk proxy/ClientBase örneği oluşturulur oluşturulmaz sabittir.

Önbelleğe Alma Davranışını Belirtme

Önbelleğe Alma davranışı, özelliği aşağıdaki değerlerden birine ayarlanarak CacheSetting belirtilir.

Önbellek Ayarı Değeri Açıklama
AlwaysOn Uygulama etki alanı içindeki tüm örnekleri ClientBase<TChannel> önbelleğe alma işlemine katılabilir. Geliştirici, önbelleğe alma işleminin herhangi bir olumsuz güvenlik etkisi olmadığını belirledi. Önbelleğe Alma üzerindeki "güvenlik duyarlı" özelliklere ClientBase<TChannel> erişilse bile kapatılmaz. "Güvenlik açısından hassas" özellikleri ClientBase<TChannel> ve EndpointChannelFactoryşeklindedirClientCredentials.
Default Yalnızca yapılandırma dosyalarında tanımlanan uç noktalardan oluşturulan örnekleri ClientBase<TChannel> , uygulama etki alanı içinde önbelleğe alma işlemine katılır. ClientBase<TChannel> Bu uygulama etki alanı içinde program aracılığıyla oluşturulan örnekleri önbelleğe alma işlemine katılmaz. Ayrıca, "güvenlik açısından hassas" özelliklerden herhangi birine erişildiğinde, örneğinde önbelleğe alma devre dışı bırakılır ClientBase<TChannel> .
AlwaysOff Önbelleğe Alma, söz konusu uygulama etki alanı içindeki belirli bir türün tüm örnekleri ClientBase<TChannel> için kapatılır.

Aşağıdaki kod parçacıkları özelliğinin CacheSetting nasıl kullanılacağını göstermektedir.

class Program
{
   static void Main(string[] args)
   {
      ClientBase<ITest>.CacheSettings = CacheSettings.AlwaysOn;
      foreach (string msg in messages)
      {
         using (TestClient proxy = new TestClient (new BasicHttpBinding(), new EndpointAddress(address)))
         {
            // ...
            proxy.Test(msg);
            // ...
         }
      }
   }
}
// Generated by SvcUtil.exe
public partial class TestClient : System.ServiceModel.ClientBase, ITest { }

Yukarıdaki kodda, tüm örnekleri TestClient aynı kanal fabrikasını kullanır.

class Program
{
   static void Main(string[] args)
   {
      ClientBase<ITest>.CacheSettings = CacheSettings.Default;
      int i = 1;
      foreach (string msg in messages)
      {
         using (TestClient proxy = new TestClient ("MyEndpoint", new EndpointAddress(address)))
         {
            if (i == 4)
            {
               ServiceEndpoint endpoint = proxy.Endpoint;
               ... // use endpoint in some way
            }
            proxy.Test(msg);
         }
         i++;
   }
}

// Generated by SvcUtil.exe
public partial class TestClient : System.ServiceModel.ClientBase, ITest {}

Yukarıdaki örnekte, örneği #4 dışında tüm örnekleri TestClient aynı kanal fabrikasını kullanır. Örnek #4, kullanımı için özel olarak oluşturulmuş bir kanal fabrikası kullanır. Bu ayar, belirli bir uç noktanın aynı kanal fabrika türündeki diğer uç noktalardan (bu örnekte ITest) farklı güvenlik ayarlarına ihtiyaç duyduğu senaryolar için çalışır.

class Program
{
   static void Main(string[] args)
   {
      ClientBase<ITest>.CacheSettings = CacheSettings.AlwaysOff;
      foreach (string msg in messages)
      {
         using (TestClient proxy = new TestClient ("MyEndpoint", new EndpointAddress(address)))
         {
            proxy.Test(msg);
         }
      }
   }
}

// Generated by SvcUtil.exe
public partial class TestClient : System.ServiceModel.ClientBase, ITest {}

Yukarıdaki örnekte, tüm örnekleri farklı kanal fabrikaları TestClient kullanır. Bu, her uç noktanın farklı güvenlik gereksinimleri olduğunda ve önbelleğe almak mantıklı olmadığında kullanışlıdır.

Ayrıca bkz.