Pabrik Saluran dan Pembuatan Cache

Aplikasi klien WCF menggunakan kelas ChannelFactory<TChannel> untuk membuat saluran komunikasi dengan layanan WCF. Membuat instans ChannelFactory<TChannel> menimbulkan beberapa overhead karena melibatkan operasi berikut:

  • Membangun pohon ContractDescription

  • Mencerminkan semua jenis CLR yang diperlukan

  • Membangun tumpukan saluran

  • Membuang sumber daya

Untuk membantu meminimalkan overhead ini, WCF dapat menyimpan pabrik saluran saat Anda menggunakan proksi klien WCF.

Tip

Anda memiliki kontrol langsung atas pembuatan pabrik saluran saat menggunakan kelas ChannelFactory<TChannel> secara langsung.

Proksi klien WCF yang dihasilkan dengan Alat Utilitas Metadata ServiceModel (Svcutil.exe) berasal dari ClientBase<TChannel>. ClientBase<TChannel> mendefinisikan properti CacheSetting statis yang mendefinisikan perilaku pembuatan cache pabrik saluran. Pengaturan cache dibuat untuk jenis tertentu. Misalnya, pengaturan ClientBase<ITest>.CacheSettings ke salah satu nilai yang ditentukan di bawah ini hanya akan memengaruhi proksi/ClientBase jenis ITest tersebut. Pengaturan cache untuk ClientBase<TChannel> tertentu tidak dapat diubah segera setelah instans proksi/ClientBase pertama dibuat.

Menentukan Perilaku Pembuatan Cache

Perilaku pembuatan cache ditentukan dengan mengatur properti CacheSetting ke salah satu nilai berikut.

Nilai Pengaturan Cache Deskripsi
AlwaysOn Semua instans ClientBase<TChannel> dalam domain aplikasi dapat berpartisipasi dalam pembuatan cache. Pengembang telah menentukan bahwa tidak ada implikasi keamanan yang merugikan untuk pembuatan cache. Pembuatan cache tidak akan dimatikan meskipun properti "sensitif terhadap keamanan" pada ClientBase<TChannel> diakses. Properti "sensitif terhadap keamanan" ClientBase<TChannel> adalah ClientCredentials, Endpoint, dan ChannelFactory.
Default Hanya instans ClientBase<TChannel> yang dibuat dari titik akhir yang ditentukan dalam file konfigurasi yang berpartisipasi dalam pembuatan cache dalam domain aplikasi. Instans ClientBase<TChannel> yang dibuat secara terprogram dalam domain aplikasi tersebut tidak akan berpartisipasi dalam pembuatan cache. Selain itu, pembuatan cache akan dinonaktifkan untuk instans ClientBase<TChannel> setelah salah satu properti "sensitif keamanan" diakses.
AlwaysOff Pembuatan cache dinonaktifkan untuk semua instans ClientBase<TChannel> jenis tertentu dalam domain aplikasi yang dimaksud.

Cuplikan kode berikut menggambarkan cara menggunakan properti CacheSetting.

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

Dalam kode di atas, semua instans TestClient akan menggunakan pabrik saluran yang sama.

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

Dalam contoh di atas, semua instans TestClient akan menggunakan pabrik saluran yang sama kecuali instans nomor 4. Instance nomor 4 akan menggunakan pabrik saluran yang dibuat khusus untuk penggunaannya. Pengaturan ini berfungsi untuk skenario ketika titik akhir tertentu membutuhkan pengaturan keamanan yang berbeda dari titik akhir lain dari jenis pabrik saluran yang sama (dalam hal ini ITest).

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

Dalam contoh di atas, semua instans TestClient akan menggunakan pabrik saluran yang berbeda. Hal ini berguna ketika setiap titik akhir memiliki persyaratan keamanan yang berbeda dan tidak masuk akal untuk di-cache.

Lihat juga