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. "ChannelFactory<TChannel> örnekleri oluşturmak, aşağıdaki işlemleri içerdiğinden bazı ek yüklere neden olur:"

  • ContractDescription ağacını oluşturmak

  • Tüm gerekli CLR türlerini yansıtma

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

Tavsiye

ChannelFactory<TChannel> sınıfını doğrudan kullandığınızda, kanal fabrikasını oluşturma üzerinde doğrudan kontrolünüz vardır.

ServiceModel Meta Veri Yardımcı Programı (Svcutil.exe) ile oluşturulan WCF istemci proxy'leri ClientBase<TChannel>'den 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, ClientBase<ITest>.CacheSettings aşağıda tanımlanan değerlerden birine ayarlandığında, yalnızca türündeki ITest ara sunucu/ClientBase'i etkileyecektir. Belirli bir ClientBase<TChannel> için önbellek ayarı, ilk proxy/ClientBase örneği oluşturulduğunda değişmez hâle gelir.

Ö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. Üzerindeki "güvenlik duyarlı" özelliklere ClientBase<TChannel> erişilse bile önbelleğe alma kapatılmaz. "‘Güvenlik açısından hassas’ özellikleri ClientBase<TChannel>, ClientCredentials, Endpoint ve ChannelFactory şeklindedir."
Default Yalnızca yapılandırma dosyalarında tanımlanan uç noktalardan oluşturulan ClientBase<TChannel> örnekleri, uygulama etki alanı içinde önbelleğe alma işlemine katılır. ClientBase<TChannel> uygulama etki alanı içinde programatik olarak oluşturulan herhangi bir örnek, önbelleğe alma işlemine katılmaz. Ayrıca, ClientBase<TChannel> örneğinde "güvenlik açısından hassas" özelliklerden herhangi birine erişildiğinde önbelleğe alma devre dışı bırakılır.
AlwaysOff Söz konusu uygulama etki alanı içindeki belirli bir türün tüm ClientBase<TChannel> örnekleri için önbelleğe alma kapalıdı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, TestClient içinde tüm örnekler 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, örnek #4 hariç, tüm TestClient örnekleri 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 TestClient örnekleri farklı kanal fabrikalarını 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 bakınız