Упрощенная конфигурация

Настройка служб Windows Communication Foundation (WCF) может быть сложной задачей. Разных параметров много, и не всегда легко понять, какие настройки необходимы. Хотя файлы конфигурации повышают гибкость служб WCF, они также являются источником для многих проблем. платформа .NET Framework 4.6.1 устраняет эти проблемы и позволяет уменьшить размер и сложность конфигурации службы.

Упрощенная конфигурация

В файлах конфигурации службы WCF раздел <system.serviceModel> содержит элемент <service> для каждой размещенной службы. Элемент <service> содержит коллекцию <endpoint> элементов, которые указывают конечные точки, предоставляемые для каждой службы, и при необходимости набор поведения служб. Элементы <endpoint> указывают адрес, привязку и контракт, предоставляемые конечной точкой, а также при необходимости привязку конфигурации и поведения конечных точек. В <system.serviceModel> разделе также содержится <behaviors> элемент, позволяющий указать поведение службы или конечной точки. В следующем примере показан <system.serviceModel> раздел файла конфигурации.

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
   <basicHttpBinding>
      <binding name=MyBindingConfig"
               maxBufferSize="100"
               maxReceiveBufferSize="100" />
   </basicHttpBinding>
   </bindings>   <services>
    <service behaviorConfiguration="MyServiceBehavior"
             name="MyService">
      <endpoint address=""
                binding="basicHttpBinding"
                contract="ICalculator"
                bindingConfiguration="MyBindingConfig" />
      <endpoint address="mex"
                binding="mexHttpBinding"
                contract="IMetadataExchange"/>
    </service>
  </services>
</system.serviceModel>

платформа .NET Framework 4.6.1 упрощает настройку службы WCF, удаляя требование для <service> элемента. Если вы не добавляете раздел <service> или не добавляете никаких конечных точек в раздел <service>, и ваша служба программно не определяет никаких конечных точек, то набор конечных точек по умолчанию автоматически добавляется в вашу службу, по одному для каждого базового адреса службы и для каждого контракта, реализуемого вашей службой. В каждом из этих конечных адресов, адрес конечной точки соответствует базовому адресу, привязка определяется схемой базового адреса, а контракт реализуется вашей службой. Если не нужно задавать конечные точки или поведения служб или изменять какие-либо параметры привязки, то указывать файл конфигурации служб не нужно вообще. Если служба реализует два контракта, а на узле включен транспорт по протоколам HTTP и TCP, то узел службы создаст четыре точки по умолчанию: по одной на каждый контракт для каждого транспорта. Чтобы создать по умолчанию конечные точки, узел службы должен знать, какие привязки использовать. Эти параметры указываются в <protocolMappings> разделе внутри <system.serviceModel> раздела. В <protocolMappings> разделе содержится список схем транспортных протоколов, сопоставленных с типами привязки. Хост службы использует переданные ему базовые адреса, чтобы определить, какую привязку применить. В следующем примере используется <protocolMappings> элемент.

Предупреждение

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

Примечание.

Службы, размещенные под Internet Information Services (IIS) или Windows Process Activation Service (WAS), используют виртуальный каталог в качестве базового адреса.

<protocolMapping>
  <add scheme="http"     binding="basicHttpBinding" bindingConfiguration="MyBindingConfig"/>
  <add scheme="net.tcp"  binding="netTcpBinding"/>
  <add scheme="net.pipe" binding="netNamedPipeBinding"/>
  <add scheme="net.msmq" binding="netMSMQBinding"/>
</protocolMapping>

В предыдущем примере конечная точка с базовым адресом, начинающимся со схемы «http», использует привязку BasicHttpBinding. Конечная точка с базовым адресом, начинающимся со схемы «net.tcp», использует привязку NetTcpBinding. Параметры можно переопределить в локальном файле App.config или Web.config.

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

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

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>    <!-- No <service> tag is necessary. Default endpoints are added to the service -->
    <!-- The service behavior with name="" is picked up by the service -->
 </system.serviceModel>

Поведение конечных точек настраивается с помощью анонимных <behavior> разделов в <serviceBehaviors> разделах.

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

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
       <basicHttpBinding>
          <binding maxBufferSize="100"
                   maxReceiveBufferSize="100" />
       </basicHttpBinding>
    </bindings>
    <!-- No <service> tag is necessary. Default endpoints will be added to the service -->
    <!-- The service behavior with name="" will be picked up by the service -->
    <protocolMapping>
      <add scheme="http" binding="basicHttpBinding" />
  </protocolMapping>
  </system.serviceModel>

Внимание

Эта возможность относится только к конфигурации службы WCF, а не к конфигурации клиента. В большинстве случаев конфигурация клиента WCF создается с помощью средства, например svcutil.exe, или путем добавления ссылки на службу из Visual Studio. Если вы настраиваете клиент WCF вручную, необходимо добавить <в конфигурацию элемент клиента> и указать все конечные точки, которые вы хотите вызвать.

См. также