Mengonfigurasi Layanan WCF dalam Kode

Windows Communication Foundation (WCF) memungkinkan pengembang untuk mengonfigurasi layanan menggunakan file konfigurasi atau kode. File konfigurasi berguna saat layanan perlu dikonfigurasi setelah disebarkan. Saat menggunakan file konfigurasi, profesional TI hanya perlu memperbarui file konfigurasi, tidak diperlukan rekompilasi. File konfigurasi, bagaimana pun, dapat menjadi rumit dan sulit untuk dipertahankan. Tidak ada dukungan untuk debugging file konfigurasi dan elemen konfigurasi yang direferensikan oleh nama yang membuat penulisan file konfigurasi rawan kesalahan dan sulit. WCF juga memungkinkan Anda untuk mengonfigurasi layanan dalam kode. Dalam versi WCF sebelumnya (4.0 dan sebelumnya) mengonfigurasi layanan dalam kode merupakan hal yang mudah dalam skenario yang dihost sendiri, kelas ServiceHost memungkinkan Anda mengonfigurasi titik akhir dan perilaku sebelum memanggil ServiceHost.Open. Namun, dalam skenario yang dihosting web, Anda tidak memiliki akses langsung ke kelas ServiceHost. Untuk mengonfigurasi layanan yang dihosting web, Anda diharuskan membuat System.ServiceModel.ServiceHostFactory yang membuat ServiceHostFactory dan melakukan konfigurasi yang diperlukan. Dimulai dengan .NET Framework 4.5, WCF menyediakan cara yang lebih mudah untuk mengonfigurasi layanan yang dihosting sendiri dan dihosting web dalam kode.

Metode Konfigurasi

Cukup tentukan metode statik publik yang dipanggil Configure dengan tanda tangan berikut di kelas penerapan layanan Anda:

public static void Configure(ServiceConfiguration config)

Metode Konfigurasi mengambil instans ServiceConfiguration yang memungkinkan pengembang untuk menambahkan titik akhir dan perilaku. Metode ini dipanggil oleh WCF sebelum host layanan dibuka. saat ditentukan, pengaturan konfigurasi layanan apa pun yang ditentukan dalam file app.config atau web.config akan diabaikan.

Cuplikan kode berikut menggambarkan cara menentukan metode Configure dan menambahkan titik akhir layanan, perilaku titik akhir, dan perilaku layanan:

public class Service1 : IService1
    {
        public static void Configure(ServiceConfiguration config)
        {
            ServiceEndpoint se = new ServiceEndpoint(new ContractDescription("IService1"), new BasicHttpBinding(), new EndpointAddress("basic"));
            se.Behaviors.Add(new MyEndpointBehavior());
            config.AddServiceEndpoint(se);

            config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
            config.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
        }

        public string GetData(int value)
        {
            return $"You entered: {value}";
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }

Untuk mengaktifkan protokol seperti https untuk layanan, Anda dapat secara eksplisit menambahkan titik akhir yang menggunakan protokol atau Anda dapat secara otomatis menambahkan titik akhir dengan memanggil ServiceConfiguration.EnableProtocol(Binding) yang menambahkan titik akhir untuk setiap alamat dasar yang kompatibel dengan protokol dan setiap kontrak layanan yang ditentukan. Kode berikut mengilustrasikan cara menggunakan metode ServiceConfiguration.EnableProtocol:

public class Service1 : IService1
{
    public string GetData(int value);
    public static void Configure(ServiceConfiguration config)
    {
        // Enable "Add Service Reference" support
       config.Description.Behaviors.Add( new ServiceMetadataBehavior { HttpGetEnabled = true });
       // set up support for http, https, net.tcp, net.pipe
       config.EnableProtocol(new BasicHttpBinding());
       config.EnableProtocol(new BasicHttpsBinding());
       config.EnableProtocol(new NetTcpBinding());
       config.EnableProtocol(new NetNamedPipeBinding());
       // add an extra BasicHttpBinding endpoint at http:///basic
       config.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(),"basic");
    }
}

Pengaturan di bagian <protocolMappings> hanya digunakan jika tidak ada titik akhir aplikasi yang ditambahkan ke ServiceConfiguration secara terprogram. Anda dapat secara opsional memuat konfigurasi layanan dari file konfigurasi aplikasi default dengan memanggil LoadFromConfiguration lalu mengubah pengaturan. Kelas LoadFromConfiguration() juga memungkinkan Anda memuat konfigurasi dari konfigurasi terpusat. Kode berikut mengilustrasikan cara menerapkannya:

public class Service1 : IService1
{
    public void DoWork();
    public static void Configure(ServiceConfiguration config)
    {
          config.LoadFromConfiguration(ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = @"c:\sharedConfig\MyConfig.config" }, ConfigurationUserLevel.None));
    }
}

Penting

Perhatikan bahwa LoadFromConfiguration mengabaikan pengaturan <host> dalam tag <service> dari <system.serviceModel>. Secara konseptual, <host> adalah tentang konfigurasi host, bukan konfigurasi layanan, dan akan dimuat sebelum metode Konfigurasi dijalankan.

Lihat juga