Exemplo de configuração
O exemplo de configuração demonstra o uso de um arquivo de configuração para tornar um serviço detetável.
Configuração do Serviço
O arquivo de configuração neste exemplo demonstra dois recursos:
Tornando o serviço detetável em relação a um padrão UdpDiscoveryEndpoint.
Ajustando informações relacionadas à descoberta para o ponto de extremidade do aplicativo do serviço e ajustando algumas das configurações relacionadas à descoberta no ponto de extremidade padrão.
Para habilitar a descoberta, algumas alterações devem ser feitas no arquivo de configuração do aplicativo para o serviço:
Um ponto de extremidade de descoberta deve ser adicionado ao
<service>
elemento . Este é um parâmetro de avaliação padrão UdpDiscoveryEndpoint . Este é um ponto de extremidade do sistema que o tempo de execução associa ao serviço de descoberta. O serviço de descoberta escuta mensagens nesse ponto de extremidade.Um
<serviceDiscovery>
comportamento é adicionado à<serviceBehaviors>
seção. Isso permite que o serviço seja descoberto em tempo de execução e usa o ponto de extremidade de descoberta mencionado anteriormente para ouvir a descobertaProbe
eResolve
as mensagens. Com essas duas adições, o serviço pode ser descoberto no ponto de extremidade de descoberta especificado.
O trecho de configuração a seguir mostra um serviço com um ponto de extremidade de aplicativo e um ponto de extremidade de descoberta definidos:
<services>
<service name="Microsoft.Samples.Discovery.CalculatorService"
behaviorConfiguration="calculatorServiceBehavior">
<endpoint address=""
binding="wsHttpBinding"
contract="Microsoft.Samples.Discovery.ICalculatorService"
behaviorConfiguration="endpointBehaviorConfiguration" />
<endpoint name="udpDiscovery"
kind="udpDiscoveryEndpoint"
endpointConfiguration="adhocDiscoveryEndpointConfiguration"/> </service>
</services>
Para aproveitar os anúncios, você precisará adicionar um ponto de extremidade do anúncio. Para fazer isso, modifique o arquivo de configuração conforme mostrado no código a seguir.
<serviceDiscovery>
<announcementEndpoints>
<endpoint kind="udpAnnouncementEndpoint"/>
</announcementEndpoints>
</serviceDiscovery>
Adicionar um ponto de extremidade de anúncio ao comportamento do serviço de descoberta cria um cliente de anúncio padrão para o serviço. Isso garante que o serviço enviará um anúncio on-line e off-line quando o serviço for aberto e fechado, respectivamente.
Esse arquivo de configuração vai além dessas etapas simples, modificando comportamentos adicionais. É possível controlar informações relacionadas à descoberta usando pontos de extremidade específicos. Ou seja, um usuário pode controlar se um ponto de extremidade pode ser descoberto e o usuário também pode marcar esse ponto de extremidade com Scopes metadados XML personalizados. Para fazer isso, o usuário deve adicionar uma behaviorConfiguration
propriedade ao ponto de extremidade do aplicativo. Nesse caso, a propriedade a seguir é adicionada ao ponto de extremidade do aplicativo.
behaviorConfiguration="endpointBehaviorConfiguration"
Agora, por meio do elemento de configuração de comportamento, você pode controlar atributos relacionados à descoberta. Nesse caso, dois escopos são adicionados ao ponto de extremidade do aplicativo.
<endpointBehaviors>
<behavior name="endpointBehaviorConfiguration">
<endpointDiscovery>
<scopes>
<add scope="http://www.example.com/calculator"/>
<add scope="ldap:///ou=engineering,o=examplecom,c=us"/>
</scopes>
</endpointDiscovery>
</behavior>
</endpointBehaviors>
Para obter mais informações sobre escopos, consulte Discovery Find e FindCriteria.
Você também pode controlar detalhes específicos do ponto de extremidade de descoberta. Isto é feito através do StandardEndpointsSection. Neste exemplo, a versão do protocolo usado é modificada, bem como a adição de um maxResponseDelay
atributo como mostrado no exemplo de código a seguir.
<standardEndpoints>
<udpDiscoveryEndpoint>
<standardEndpoint name="adhocDiscoveryEndpointConfiguration" discoveryVersion="WSDiscovery11" maxResponseDelay="00:00:00.600" />
</udpDiscoveryEndpoint>
</standardEndpoints>
A seguir está o arquivo de configuração completo usado neste exemplo:
<configuration>
<system.serviceModel>
<services>
<service name="Microsoft.Samples.Discovery.CalculatorService"
behaviorConfiguration="calculatorServiceBehavior">
<endpoint address=""
binding="wsHttpBinding"
contract="Microsoft.Samples.Discovery.ICalculatorService"
behaviorConfiguration="endpointBehaviorConfiguration" />
<!-- Define the discovery endpoint -->
<endpoint name="udpDiscovery" kind="udpDiscoveryEndpoint" endpointConfiguration="adhocDiscoveryEndpointConfiguration"/> </service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="calculatorServiceBehavior">
<!-- Add an announcement endpoint -->
<serviceDiscovery>
<announcementEndpoints>
<endpoint kind="udpAnnouncementEndpoint"/>
</announcementEndpoints>
</serviceDiscovery>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="endpointBehaviorConfiguration">
<!-- Add scopes used to identify the service -->
<endpointDiscovery>
<scopes>
<add scope="http://www.example.com/calculator"/>
<add scope="ldap:///ou=engineering,o=examplecom,c=us"/>
</scopes>
</endpointDiscovery>
</behavior>
</endpointBehaviors>
</behaviors>
<standardEndpoints>
<udpDiscoveryEndpoint>
<!-- Configure the UDP discovery endpoint -->
<standardEndpoint name="adhocDiscoveryEndpointConfiguration" discoveryVersion="WSDiscovery11" maxResponseDelay="00:00:00.600" />
</udpDiscoveryEndpoint>
</standardEndpoints>
</system.serviceModel>
</configuration>
Configuração de Cliente
No arquivo de configuração do aplicativo para o cliente, um standardEndpoint
do tipo dynamicEndpoint
é usado para utilizar a descoberta, conforme mostrado no trecho de configuração a seguir.
<client>
<!-- Create an endpoint, make kind="dynamicEndpoint" and use the endpointConfiguration to change settings of DynamicEndpoint -->
<endpoint name="calculatorEndpoint"
binding="wsHttpBinding"
contract="ICalculatorService"
kind ="dynamicEndpoint"
endpointConfiguration="dynamicEndpointConfiguration">
</endpoint>
</client>
Quando um cliente está usando um dynamicEndpoint
, o tempo de execução executa a descoberta automaticamente. Várias configurações são usadas durante a descoberta, como as discoveryClientSettings
definidas na seção , que especifica o tipo de ponto de extremidade de descoberta a ser usado:
<endpoint kind="udpDiscoveryEndpoint" endpointConfiguration="adhocDiscoveryEndpointConfiguration" />
Os critérios de localização utilizados para procurar serviços:
<!-- Add Scopes, ScopeMatchBy, Extensions and termination criteria in FindCriteria -->
<findCriteria scopeMatchBy="http://schemas.microsoft.com/ws/2008/06/discovery/rfc" duration="00:00:10" maxResults="1">
<scopes>
<add scope="http://www.microsoft.com/building42/floor1"/>
</scopes>
<!-- These extensions are sent from the client to the service as part of the probe message -->
<extensions>
<CustomMetadata>This is custom metadata that is sent to the service along with the client's find request.</CustomMetadata>
</extensions>
</findCriteria>
Este exemplo estende esse recurso e modifica o FindCriteria usado pelo cliente, bem como algumas propriedades do padrão updDiscoveryEndpoint
usado para descoberta. Os FindCriteria são modificados para usar um escopo e um algoritmo específico scopeMatchBy
, bem como critérios de terminação personalizados. Além disso, o exemplo também mostra como um cliente pode enviar elementos XML usando Probe
mensagens. Por fim, algumas alterações são feitas no UdpDiscoveryEndpoint, como a versão do protocolo usado e as configurações específicas do UDP, conforme mostrado no arquivo de configuração a seguir.
<udpDiscoveryEndpoint>
<!-- Specify the discovery protocol version and UDP transport settings. -->
<standardEndpoint name="adhocDiscoveryEndpointConfiguration" discoveryVersion="WSDiscovery11">
<transportSettings duplicateMessageHistoryLength="2048"
maxPendingMessageCount="5"
maxReceivedMessageSize="8192"
maxBufferPoolSize="262144"/>
</standardEndpoint>
</udpDiscoveryEndpoint>
A seguir está a configuração completa do cliente usada no exemplo.
<configuration>
<system.serviceModel>
<client>
<!-- Create an endpoint, make kind="dynamicEndpoint" and use the endpointConfiguration to change settings of DynamicEndpoint -->
<endpoint name="calculatorEndpoint"
binding="wsHttpBinding"
contract="ICalculatorService"
kind ="dynamicEndpoint"
endpointConfiguration="dynamicEndpointConfiguration">
</endpoint>
</client>
<standardEndpoints>
<dynamicEndpoint>
<standardEndpoint name="dynamicEndpointConfiguration">
<discoveryClientSettings>
<!-- Controls where the discovery happens. In this case, Probe message is sent over UdpDiscoveryEndpoint. -->
<endpoint kind="udpDiscoveryEndpoint" endpointConfiguration="adhocDiscoveryEndpointConfiguration" />
<!-- Add Scopes, ScopeMatchBy, Extensions and termination criteria in FindCriteria -->
<findCriteria scopeMatchBy="http://schemas.microsoft.com/ws/2008/06/discovery/rfc" duration="00:00:10" maxResults="1">
<scopes>
<add scope="http://www.microsoft.com/building42/floor1"/>
</scopes>
<!-- These extensions are sent from the client to the service as part of the probe message -->
<extensions>
<CustomMetadata>This is custom metadata that is sent to the service along with the client's find request.</CustomMetadata>
</extensions>
</findCriteria>
</discoveryClientSettings>
</standardEndpoint>
</dynamicEndpoint>
<udpDiscoveryEndpoint>
<!-- Specify the discovery protocol version and UDP transport settings. -->
<standardEndpoint name="adhocDiscoveryEndpointConfiguration" discoveryVersion="WSDiscovery11">
<transportSettings duplicateMessageHistoryLength="2048"
maxPendingMessageCount="5"
maxReceivedMessageSize="8192"
maxBufferPoolSize="262144"/>
</standardEndpoint>
</udpDiscoveryEndpoint>
</standardEndpoints>
</system.serviceModel>
</configuration>
Para usar este exemplo
Este exemplo usa pontos de extremidade HTTP e, para executá-lo, ACLs de URL adequadas devem ser adicionadas. Para obter mais informações, consulte Configurando HTTP e HTTPS. A execução do comando a seguir com um privilégio elevado deve adicionar as ACLs apropriadas. Você pode querer substituir seu domínio e nome de usuário para os seguintes argumentos se o comando não funcionar como está.
netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%
Compile a solução.
Execute o executável do serviço a partir do diretório de compilação.
Execute o executável do cliente. Observe que o cliente é capaz de localizar o serviço.