Настройка обнаружения в файле конфигурации
При обнаружении используются четыре основные группы параметров конфигурации. В этом разделе кратко описана каждая из них, а также приведены примеры их настройки. В конце каждого раздела имеется ссылка на более подробную документацию о каждой области.
Конфигурация поведения
При обнаружении используется поведение служб и конечных точек. Поведение ServiceDiscoveryBehavior включает обнаружение для всех конечных точек службы и позволяет указывать конечные точки объявления. В следующем примере показано, как добавить поведение ServiceDiscoveryBehavior и указать конечную точку объявления.
<behaviors>
<serviceBehaviors>
<behavior name="helloWorldServiceBehavior">
<serviceDiscovery>
<announcementEndpoints>
<endpoint kind="udpAnnouncementEndpoint"/>
</announcementEndpoints>
</serviceDiscovery>
</behavior>
</serviceBehaviors>
</behaviors>
После указания поведения наведите ссылку на него из <service>
элемента, как показано в следующем примере.
<system.serviceModel>
<services>
<service name="HelloWorldService" behaviorConfiguration="helloWorldServiceBehavior">
<!-- Application Endpoint -->
<endpoint address="endpoint0"
binding="basicHttpBinding"
contract="IHelloWorldService" />
<!-- Discovery Endpoints -->
<endpoint kind="udpDiscoveryEndpoint" />
</service>
</services>
</system.serviceModel>
Чтобы обеспечить возможность обнаружения службы, также необходимо добавить конечную точку обнаружения. В рассмотренном выше примере добавляется стандартная конечная точка UdpDiscoveryEndpoint.
При добавлении конечных точек объявления необходимо также добавить службу прослушивателя объявлений в <services>
элемент, как показано в следующем примере.
<services>
<service name="HelloWorldService" behaviorConfiguration="helloWorldServiceBehavior">
<!-- Application Endpoint -->
<endpoint address="endpoint0"
binding="basicHttpBinding"
contract="IHelloWorldService" />
<!-- Discovery Endpoints -->
<endpoint kind="udpDiscoveryEndpoint" />
</service>
<!-- Announcement Listener Configuration -->
<service name="AnnouncementListener">
<endpoint kind="udpAnnouncementEndpoint" />
</service>
</services>
Поведение EndpointDiscoveryBehavior используется для включения или выключения обнаружения определенной конечной точки. В следующем примере показана настройка двух конечных точек приложения для службы, одной со включенным обнаружением, другой ― с выключенным. Для каждой конечной точки добавляется поведение EndpointDiscoveryBehavior.
<system.serviceModel>
<services>
<service name="HelloWorldService"
behaviorConfiguration="helloWorldServiceBehavior">
<!-- Application Endpoints -->
<endpoint address="endpoint0"
binding="basicHttpBinding"
contract="IHelloWorldService"
behaviorConfiguration="ep0Behavior" />
<endpoint address="endpoint1"
binding="basicHttpBinding"
contract="IHelloWorldService"
behaviorConfiguration="ep1Behavior" />
<!-- Discovery Endpoints -->
<endpoint kind="udpDiscoveryEndpoint" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="helloWorldServiceBehavior">
<serviceDiscovery />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="ep0Behavior">
<endpointDiscovery enabled="true"/>
</behavior>
<behavior name="ep1Behavior">
<endpointDiscovery enabled="false"/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Поведение EndpointDiscoveryBehavior можно также использовать для добавления пользовательских метаданных к метаданным конечной точки, возвращенным службой. В приведенном ниже примере показано, как это сделать.
<behavior name="ep4Behavior">
<endpointDiscovery enabled="true">
<extensions>
<CustomMetadata>This is custom metadata.</CustomMetadata>
<d:Types xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:i="http://printer.example.org/2003/imaging">i:PrintBasic</d:Types>
<CustomMetadata nested="true">
<NestedMetadata>This is a nested custom metadata.</NestedMetadata>
</CustomMetadata>
</extensions>
</endpointDiscovery>
</behavior>
Поведение EndpointDiscoveryBehavior можно также использовать для добавления областей и типов, с помощью которых клиент выполняет поиск служб. В следующем примере показано, как задать это в файле конфигурации на стороне клиента.
<behavior name="ep2Behavior">
<endpointDiscovery enabled="true">
<scopes>
<add scope="http://www.microsoft.com/building42/floor1"/>
<add scope="ldap:///ou=engineeringo=examplecomc=us"/>
</scopes>
<types>
<add name="test" namespace="http://example.microsoft.com/" />
<add name="additionalContract" namespace="http://example.microsoft.com/" />
</types>
</endpointDiscovery>
</behavior>
Дополнительные сведения о ServiceDiscoveryBehavior обнаружении WCF см EndpointDiscoveryBehavior . в разделе "Обзор обнаружения WCF".
Настройка элемента привязки
Настройка элемента привязки представляет наибольший интерес на стороне клиента. С ее помощью можно указать критерии поиска, используемые для обнаружения служб из клиентского приложения WCF. Следующий пример создает пользовательскую привязку с каналом DiscoveryClient и указывает критерии поиска, включая тип и область. Кроме того, он также указывает значения для свойств Duration и MaxResults.
<bindings>
<customBinding>
<!-- Binding Configuration for the Application Endpoint -->
<binding name="discoBindingConfiguration">
<discoveryClient>
<endpoint kind="discoveryEndpoint"
address="http://localhost:8000/ConfigTest/Discovery"
binding="customBinding"
bindingConfiguration="httpSoap12WSAddressing10"/>
<findCriteria duration="00:00:10" maxResults="2">
<types>
<add name="IHelloWorldService"/>
</types>
<scopes>
<add scope="http://www.microsoft.com/building42/floor1"/>
</scopes>
</findCriteria>
</discoveryClient>
<textMessageEncoding messageVersion="Soap11"/>
<httpTransport />
</binding>
</customBinding>
</bindings>
На эту пользовательскую конфигурацию привязки должна ссылаться клиентская конечная точка.
<client>
<endpoint address="http://schemas.microsoft.com/discovery/dynamic"
binding="customBinding"
bindingConfiguration="discoBindingConfiguration"
contract="IHelloWorldService" />
</client>
Дополнительные сведения о критериях поиска см. в разделе Discovery Find and FindCriteria. Дополнительные сведения об обнаружении и привязке элементов см. в обзоре обнаружения WCF
Конфигурация стандартной конечной точки
Стандартные конечные точки - точки, имеющие значения по умолчанию одного или нескольких свойств (адрес, привязка или контракт), либо одно или несколько свойств, значения которых нельзя изменить. Платформа .NET 4 поставляется с тремя стандартными конечными точками, связанными с обнаружением: UdpDiscoveryEndpoint, UdpAnnouncementEndpoint и DynamicEndpoint. Конечная точка UdpDiscoveryEndpoint ― это стандартная конечная точка, настроенная для операций обнаружения через привязку для многоадресной рассылки. Конечная точка UdpAnnouncementEndpoint ― это стандартная конечная точка, настроенная для отправки сообщений с объявлениями по привязке UDP. Это DynamicEndpoint стандартная конечная точка, которая использует обнаружение для поиска адреса конечной точки обнаруженной службы динамически во время выполнения. Стандартные привязки указываются с элементом <endpoint>
, содержащим атрибут типа, который указал тип стандартной конечной точки для добавления. В следующем примере демонстрируется, как добавить UdpDiscoveryEndpoint и UdpAnnouncementEndpoint.
<services>
<service name="HelloWorldService">
<!-- ... -->
<endpoint kind="udpDiscoveryEndpoint" />
</service>
<service name="AnnouncementListener">
<endpoint kind="udpAnnouncementEndpoint" />
</service>
</services>
Стандартные конечные точки настраиваются в элементе <standardEndpoints>
. В следующем примере показано, как настроить UdpDiscoveryEndpoint и UdpAnnouncementEndpoint.
<standardEndpoints>
<udpAnnouncementEndpoint>
<standardEndpoint
name="udpAnnouncementEndpointSettings"
multicastAddress="soap.udp://239.255.255.250:3703"
maxAnnouncementDelay="00:00:00.800">
<transportSettings
duplicateMessageHistoryLength="1028"
maxPendingMessageCount="10"
maxMulticastRetransmitCount="3"
maxUnicastRetransmitCount="2"
socketReceiveBufferSize="131072"
timeToLive="2" />
</standardEndpoint>
</udpAnnouncementEndpoint>
<udpDiscoveryEndpoint>
<standardEndpoint
name="udpDiscoveryEndpointSettings"
multicastAddress="soap.udp://239.255.255.252:3704"
maxResponseDelay="00:00:00.800">
<transportSettings
duplicateMessageHistoryLength="2048"
maxPendingMessageCount="5"
maxReceivedMessageSize="8192"
maxBufferPoolSize="262144"/>
</standardEndpoint>
</udpDiscoveryEndpoint>
</standardEndpoints>
После добавления стандартной конфигурации конечной точки найдите конфигурацию в элементе <endpoint>
для каждой конечной точки, как показано в следующем примере.
<services>
<service name="HelloWorldService">
<!-- ... -->
<endpoint kind="udpDiscoveryEndpoint" endpointConfiguration="udpDiscoveryEndpointSettings"/>
</service>
<service name="AnnouncementListener">
<endpoint kind="udpAnnouncementEndpoint" endpointConfiguration="udpAnnouncementEndpointSettings" />
</service>
</services>
В отличие от других стандартных конечных точек, используемых при обнаружении, указывается привязка и контракт для DynamicEndpoint. В следующем примере показано, как добавить и настроить DynamicEndpoint.
<system.serviceModel>
<client>
<endpoint kind="dynamicEndpoint" binding="basicHttpBinding" contract="IHelloWorldService" endpointConfiguration="dynamicEndpointConfiguration" />
</client>
<standardEndpoints>
<dynamicEndpoint>
<standardEndpoint name="dynamicEndpointConfiguration">
<discoveryClientSettings>
<findCriteria scopeMatchBy="http://schemas.microsoft.com/ws/2008/06/discovery/rfc" duration="00:00:10" maxResults="2">
<types>
<add name="IHelloWorldService"/>
</types>
<scopes>
<add scope="http://www.microsoft.com/building42/floor1"/>
</scopes>
<extensions>
<CustomMetadata>This is custom metadata.</CustomMetadata>
</extensions>
</findCriteria>
</discoveryClientSettings>
</standardEndpoint>
</dynamicEndpoint>
</standardEndpoints>
</system.serviceModel>
Дополнительные сведения о стандартных конечных точках см. в разделе "Стандартные конечные точки".