Поделиться через


Настройка служб WCF в коде

Windows Communication Foundation (WCF) позволяет разработчикам настраивать службы с помощью файлов конфигурации или кода. Файлы конфигурации используются, если необходимо настроить службу после ее развертывания. При использовании файлов конфигурации ИТ-работнику требуется только обновить файл конфигурации без необходимости выполнять повторную компиляцию. Файлы конфигурации, однако, могут быть сложными и требовать больших усилий при обслуживании. Отсутствует поддержка отладки файлов конфигурации, и ссылки на элементы конфигурации осуществляются по именам, что усложняет работу и способствует совершению ошибок при создании файлов конфигурации. WCF также позволяет настраивать службы в коде. В более ранних версиях WCF (4.0 и более ранних версий) настройка служб в коде была легкой в локальном сценарии, ServiceHost класс позволил настроить конечные точки и поведение до вызова ServiceHost.Open. Однако в сценариях с размещением в Интернете нет прямого доступа к классу ServiceHost. Чтобы настроить службу, размещенную в сети, приходилось создавать класс System.ServiceModel.ServiceHostFactory, который создавал ServiceHostFactory и выполнял необходимые настройки. Начиная с версии платформа .NET Framework 4.5 WCF предоставляет более простой способ настройки как размещенных, так и размещенных в интернете служб в коде.

Метод Configure

Просто определите открытый статический метод с именем Configure со следующей сигнатурой в классе реализации службы.

public static void Configure(ServiceConfiguration config)

Метод принимает экземпляр ServiceConfiguration, что позволяет разработчикам добавлять конечные точки и расширения функциональности. Этот метод вызывается WCF перед открытием узла службы. Если он задан, то никакие параметры конфигурации службы, определенные в файле app.config или web.config, не учитываются.

В следующем фрагменте кода показано, как определить метод Configure и добавить конечную точку службы, поведение конечной точки и расширения функциональности служб.

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

Чтобы включить для службы протокол (например, HTTPS), следует явно добавить конечную точку, использующую протокол, или автоматически добавить конечные точки с помощью привязки ServiceConfiguration.EnableProtocol, которая добавляет конечную точку для каждого базового адреса, совместимого с использованием определенного протокола и каждого контракта службы. В следующем примере кода показывается, как использовать метод 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");
    }
}

Параметры в <protocolMappings> разделе используются только в том случае, если конечные точки приложения не добавляются ServiceConfiguration программным способом. При необходимости можно загрузить конфигурацию службы из файла конфигурации приложения по умолчанию, вызвав LoadFromConfiguration и изменив параметры. Класс LoadFromConfiguration() также позволяет загрузить конфигурацию из централизованной конфигурации. В следующем примере кода показано, как это реализовать.

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

Внимание

Обратите внимание, что игнорирует <host> параметры в теге<system.serviceModel><service>.LoadFromConfiguration Концептуально речь <host> идет о конфигурации узла, а не конфигурации службы, и она загружается перед выполнением метода Configure.

См. также