WCF Hizmetlerini Kodda Yapılandırma

Windows Communication Foundation (WCF), geliştiricilerin yapılandırma dosyalarını veya kodunu kullanarak hizmetleri yapılandırmasına olanak tanır. Yapılandırma dosyaları, bir hizmetin dağıtıldıktan sonra yapılandırılması gerektiğinde kullanışlıdır. Yapılandırma dosyalarını kullanırken, bir BT uzmanının yalnızca yapılandırma dosyasını güncelleştirmesi gerekir, yeniden derleme gerekmez. Ancak yapılandırma dosyalarının bakımı karmaşık ve zor olabilir. Yapılandırma dosyalarında hata ayıklama desteği yoktur ve yapılandırma öğelerine adlar tarafından başvurulur ve bu da yapılandırma dosyalarını yazmanın hataya açık ve zor olmasını sağlar. WCF, hizmetleri kodda yapılandırmanıza da olanak tanır. WCF'nin önceki sürümlerinde (4.0 ve önceki sürümlerde) hizmetleri kodda yapılandırmak şirket içinde barındırılan ServiceHost senaryolarda kolaydı, sınıfı ServiceHost.Open çağrısından önce uç noktaları ve davranışları yapılandırmanıza izin verdi. Ancak web'de barındırılan senaryolarda sınıfına ServiceHost doğrudan erişiminiz yoktur. Web'de barındırılan bir hizmeti yapılandırmak için, öğesini oluşturan ve gerekli yapılandırmayı ServiceHostFactory gerçekleştiren bir System.ServiceModel.ServiceHostFactory oluşturmanız gerekiyordu. .NET Framework 4.5'den başlayarak WCF, kodda hem şirket içinde barındırılan hem de web'de barındırılan hizmetleri yapılandırmak için daha kolay bir yol sağlar.

Configure yöntemi

Hizmet uygulama sınıfınızda aşağıdaki imza ile adlı Configure bir genel statik yöntem tanımlamanız yeterlidir:

public static void Configure(ServiceConfiguration config)

Configure yöntemi, geliştiricinin uç noktalar ve davranışlar eklemesini sağlayan bir ServiceConfiguration örnek alır. Bu yöntem, hizmet konağı açılmadan önce WCF tarafından çağrılır. Tanımlandığında, app.config veya web.config dosyasında belirtilen tüm hizmet yapılandırma ayarları yoksayılır.

Aşağıdaki kod parçacığında yöntemin nasıl tanımlanacağı Configure ve hizmet uç noktası, uç nokta davranışı ve hizmet davranışları nasıl ekleneceği gösterilmektedir:

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

Bir hizmet için https gibi bir protokolü etkinleştirmek için, protokolü kullanan bir uç noktayı açıkça ekleyebilir veya ServiceConfiguration.EnableProtocol(Bağlama) çağrısı yaparak otomatik olarak uç noktalar ekleyebilirsiniz. Bu da protokolle ve tanımlanan her hizmet sözleşmesiyle uyumlu her temel adres için bir uç nokta ekler. Aşağıdaki kodda ServiceConfiguration.EnableProtocol yönteminin nasıl kullanılacağı gösterilmektedir:

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");
    }
}

Bölümündeki ayarlar <protocolMappings> yalnızca program aracılığıyla uygulama uç noktaları eklenmediyse ServiceConfiguration kullanılır. İsteğe bağlı olarak, çağrı LoadFromConfiguration yaparak ve ardından ayarları değiştirerek hizmet yapılandırmasını varsayılan uygulama yapılandırma dosyasından yükleyebilirsiniz. sınıfı, LoadFromConfiguration() merkezi bir yapılandırmadan yapılandırmayı yüklemenize de olanak tanır. Aşağıdaki kodda bunun nasıl uygulandığı gösterilmektedir:

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));
    }
}

Önemli

etiketindeki <service> <system.serviceModel>ayarları yoksaydığını LoadFromConfiguration <host> unutmayın. Kavramsal olarak, <host> hizmet yapılandırmasıyla değil konak yapılandırmasıyla ilgilidir ve Configure yöntemi yürütülmeden önce yüklenir.

Ayrıca bkz.