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.