Настройка привязок для служб Windows Communication Foundation

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

Замечание

Используйте средство служебной программы метаданных ServiceModel (Svcutil.exe) с параметром /config для быстрого создания файлов конфигурации.

Основные разделы

Схема конфигурации Windows Communication Foundation (WCF) включает следующие три основных раздела (serviceModelиbindingsservices):

<configuration>
    <system.serviceModel>
        <bindings>
        </bindings>
        <services>
        </services>
        <behaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

Элементы ServiceModel

Раздел, ограничивающийся элементом system.ServiceModel , можно использовать для настройки типа службы с одной или несколькими конечными точками, а также параметрами для службы. Затем каждую конечную точку можно настроить с адресом, контрактом и привязкой. Дополнительные сведения о конечных точках см. в разделе "Общие сведения о создании конечных точек". Если конечные точки не указаны, среда выполнения добавляет конечные точки по умолчанию. Дополнительные сведения о конечных точках, привязках и поведении по умолчанию см. в статье "Упрощенная конфигурация " и "Упрощенная конфигурация" для служб WCF.

Привязка задает транспорты (HTTP, TCP, каналы, очередь сообщений) и протоколы (безопасность, надежность, потоки транзакций) и состоит из элементов привязки, каждый из которых указывает аспект взаимодействия конечной точки с миром.

Например, указание <элемента basicHttpBinding> указывает на использование HTTP в качестве транспорта для конечной точки. Это используется для подключения конечной точки во время выполнения при открытии службы с помощью этой конечной точки.

Существует два типа привязок: предопределенные и настраиваемые. Предопределенные привязки содержат полезные сочетания элементов, которые используются в распространенных сценариях. Список предопределенных типов привязки, которые предоставляет WCF, см. в разделеSystem-Provided Привязки. Если предопределенная коллекция привязок не имеет правильного сочетания функций, необходимых приложению-службе, можно создать пользовательские привязки для удовлетворения требований приложения. Дополнительные сведения о пользовательских привязках см. <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>

См. также