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

Настройка служб 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 элемент> <.

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

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

Примечание

Службы, размещенные в службах IIS или WAS, используют в качестве базового адреса виртуальный каталог.

<protocolMapping>  
  <add scheme="http"     binding="basicHttpBinding" bindingConfiguration="MyBindingConfiguration"/>  
  <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 необходимо добавить <client> элемент в конфигурацию и указать все конечные точки, которые необходимо вызвать.

См. также