Настройка привязок для служб Windows Communication Foundation
При создании приложения часто нужно отложить решения для администратора после развертывания приложения. Например, часто нет способа узнать заранее, какими будут адрес службы или универсальный код ресурса (URI). Вместо жестко запрограммированного адреса желательно разрешить администратору ввести его после создания службы. Такая гибкость достигается благодаря конфигурации.
Примечание.
Используйте средство служебной программы метаданных ServiceModel (Svcutil.exe) с параметром /config
для быстрого создания файлов конфигурации.
Основные разделы
Схема конфигурации Windows Communication Foundation (WCF) включает следующие три основных раздела (serviceModel
иbindings
services
):
<configuration>
<system.serviceModel>
<bindings>
</bindings>
<services>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
Элементы ServiceModel
Раздел, ограничивающийся элементом system.ServiceModel
, можно использовать для настройки типа службы с одной или несколькими конечными точками, а также параметрами для службы. После этого каждая конечная точка может быть настроена с адресом, контрактом и привязкой. Дополнительные сведения о конечных точках см. в разделе "Общие сведения о создании конечных точек". Если конечные точки не указаны, то среда выполнения добавит конечные точки по умолчанию. Дополнительные сведения о конечных точках по умолчанию, привязках и режимах работы см. в разделах Упрощенная конфигурация и Упрощенная конфигурация служб WCF.
Привязка задает транспорт (HTTP, TCP, каналы, очередь сообщений) и протоколы (безопасность, надежность, потоки транзакций) и состоит из элементов привязки, каждый из которых задает определенный аспект способа связи конечной точки с миром.
Например, указание <элемента basicHttpBinding> указывает на использование HTTP в качестве транспорта для конечной точки. Это используется для подключения конечной точки во время выполнения, когда открыта служба, использующая данную конечную точку.
Существует два вида привязок: предопределенная и пользовательская. Предопределенные привязки содержат полезные комбинации элементов, которые используются в общих сценариях. Список предопределенных типов привязки, предоставляемых WCF, см. в разделе "Предоставленные системой привязки". Если ни одна из стандартных коллекций привязок не имеет нужного для приложения службы сочетания возможностей, для соответствия требованиям приложения можно создать специальные привязки. Дополнительные сведения о пользовательских привязках см. в разделе customBinding>.<
В следующих четырех примерах показаны наиболее распространенные конфигурации привязки, используемые для настройки службы WCF.
Указание конечной точки для использования типа привязки
В первом примере показано, как указать конечную точку, настроенную по адресу, контракту и привязке.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<!-- This section is optional with the default configuration introduced
in .NET Framework 4. -->
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
В данном примере атрибут name
указывает на тип службы, для которой предназначена конфигурация. При создании в коде при помощи контракта HelloWorld
служба инициализируется со всеми конечными точками, указанными в конфигурации примера. Если сборка реализует только один контракт службы, атрибут может быть опущен, name
так как служба использует единственный доступный тип. Атрибут принимает строку, которая должна иметь формат Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Атрибут address
указывает универсальный код ресурса (URI), который другие конечные точки используют для связи со службой. Универсальный код ресурса (URI) может быть как абсолютным, так и относительным путем. Если указан относительный адрес, от узла ожидается предоставление базового адреса, подходящего для используемой в привязке схемы транспорта. Если адрес не настроен, в качестве базового адреса используется адрес соответствующей конечной точки.
Атрибут contract
задает контракт, который предоставляет данная конечная точка. Тип реализации службы должен реализовывать тип контракта. Если реализация службы реализует один тип контракта, это свойство может быть опущено.
Атрибут binding
выбирает предопределенную или специальную привязку для использования в данной конкретной конечной точке. Конечная точка, которая не выбирает привязку явным образом, использует выбор привязки по умолчанию, т. е. BasicHttpBinding
.
Изменение предопределенной привязки
В следующем примере изменяется заранее заданная привязка. После этого ее можно использовать для настройки любой конечной точки в службе. Привязка изменяется настройкой значения ReceiveTimeout на 1 секунду. Обратите внимание, что свойство возвращает объект TimeSpan.
Эта измененная привязка находится в разделе привязок. Теперь эта измененная привязка может использоваться при создании любой конечной точки путем установки атрибута binding
в элементе endpoint
.
Примечание.
Если задать определенное имя для привязки, то значение bindingConfiguration
, указанное в конечной точке службы, должно совпадать с этим именем.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
<bindings>
<basicHttpBinding
receiveTimeout="00:00:01"
/>
</bindings>
Настройка поведения для применения к службе
В следующем примере специальное поведение настраивается для типа службы. Элемент ServiceMetadataBehavior
используется для включения средства служебной программы метаданных ServiceModel (Svcutil.exe) для запроса службы и создания документов языка описания веб-служб (WSDL) из метаданных.
Примечание.
Если задать определенное имя для поведения, то значение behaviorConfiguration
, указанное в разделе службы или конечной точки, должно совпадать с этим именем.
<behaviors>
<behavior>
<ServiceMetadata httpGetEnabled="true" />
</behavior>
</behaviors>
<services>
<service
name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
</services>
Предыдущая конфигурация позволяет клиенту вызывать и получать метаданные типизированной службы HelloWorld.
svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl
Указание службы с двумя конечными точками при помощи различных значений привязки
В последнем примере две конечные точки настраиваются для типа службы HelloWorld
. Каждая конечная точка использует другой настраиваемый bindingConfiguration
атрибут одного типа привязки (каждый из них изменяет basicHttpBinding
).
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello1"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="shortTimeout" />
<endpoint
address="http://computer:8080/Hello2"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="Secure" />
</service>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure">
<Security mode="Transport" />
</basicHttpBinding>
</bindings>
Можно добиться того же поведения с помощью конфигурации по умолчанию, добавив раздел protocolMapping
и настроив привязки, как показано в следующем примере.
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" bindingConfiguration="shortTimeout" />
<add scheme="https" binding="basicHttpBinding" bindingConfiguration="Secure" />
</protocolMapping>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure" />
<Security mode="Transport" />
</bindings>