Настройка служб 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.
См. также
- Настройка служб с использованием файлов конфигурации
- Настройка поведения клиентов
- Упрощенная конфигурация
- Конфигурация
- Активация на основе конфигурации в IIS и WAS
- Конфигурация и поддержка метаданных
- Конфигурация
- Практическое руководство. Указание привязки службы в конфигурации
- Практическое руководство. Создание конечной точки службы в конфигурации
- Практическое руководство. Публикация метаданных для службы с использованием файла конфигурации
- Практическое руководство. Указание привязки клиента в конфигурации