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

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

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

В файлах <system.serviceModel> конфигурации службы WCF раздел содержит <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> элемент.

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

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

Примечание.

Службы, размещенные в службах IIS или 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> разделах. Все неименованные элементы в пределах <>serviceBehaviorsиспользуются для настройки поведения службы.<behavior> Например, следующий файл конфигурации позволяет публиковать метаданные всех служб в узле.

<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 вручную, необходимо добавить <в конфигурацию элемент клиента> и указать все конечные точки, которые вы хотите вызвать.

См. также