Partilhar via


Comportamento de publicação de metadados

O exemplo de metadados demonstra como controlar os recursos de publicação de metadados de um serviço. Para evitar a divulgação não intencional de metadados de serviço potencialmente confidenciais, a configuração padrão para serviços do Windows Communication Foundation (WCF) desabilita a publicação de metadados. Esse comportamento é seguro por padrão, mas também significa que você não pode usar uma ferramenta de importação de metadados (como Svcutil.exe) para gerar o código do cliente necessário para chamar o serviço, a menos que o comportamento de publicação de metadados do serviço esteja explicitamente habilitado na configuração.

Importante

Para maior clareza, este exemplo demonstra como criar um ponto de extremidade de publicação de metadados não seguro. Esses pontos de extremidade estão potencialmente disponíveis para consumidores anônimos não autenticados e deve-se tomar cuidado antes de implantar esses pontos finais para garantir que a divulgação pública dos metadados de um serviço seja apropriada. Consulte o Exemplo de ponto de extremidade de metadados seguros personalizados para obter um exemplo que protege um ponto de extremidade de metadados.

O exemplo é baseado na Introdução, que implementa o ICalculator contrato de serviço. Neste exemplo, o cliente é um aplicativo de console (.exe) e o serviço é hospedado pelo IIS (Serviços de Informações da Internet).

Nota

O procedimento de configuração e as instruções de compilação para este exemplo estão localizados no final deste tópico.

Para que um serviço exponha metadados, o ServiceMetadataBehavior deve ser configurado no serviço. Quando esse comportamento está presente, você pode publicar metadados configurando um ponto de extremidade para expor o IMetadataExchange contrato como uma implementação de um protocolo WS-MetadataExchange (MEX). Como uma conveniência, este contrato recebeu o nome de configuração abreviado de "IMetadataExchange". Este exemplo usa o mexHttpBinding, que é uma associação padrão de conveniência que é equivalente ao wsHttpBinding com o modo de segurança definido como None. Um endereço relativo de "mex" é usado no ponto de extremidade, que quando resolvido em relação ao endereço base de serviços resulta em um endereço de ponto de extremidade de http://localhost/servicemodelsamples/service.svc/mex. A seguir mostra a configuração do comportamento:

<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <!-- The serviceMetadata behavior publishes metadata through
           the IMetadataExchange contract. When this behavior is
           present, you can expose this contract through an endpoint
           as shown below. Setting httpGetEnabled to true publishes
           the service's WSDL at the <baseaddress>?wsdl, for example,
           http://localhost/servicemodelsamples/service.svc?wsdl -->
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

A seguir mostra o ponto de extremidade MEX.

<!-- the MEX endpoint is exposed at
     http://localhost/servicemodelsamples/service.svc/mex
     To expose the IMetadataExchange contract, you
     must enable the serviceMetadata behavior as demonstrated
     previously. -->
<endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />

Este exemplo define a HttpGetEnabled propriedade como true, que também expõe os metadados do serviço usando HTTP GET. Para habilitar um ponto de extremidade de metadados HTTP GET, o serviço deve ter um endereço base HTTP. A cadeia de caracteres ?wsdl de consulta é usada no endereço base do serviço para acessar os metadados. Por exemplo, para ver o WSDL para o serviço em um navegador da Web, você usaria o endereço http://localhost/servicemodelsamples/service.svc?wsdl. Como alternativa, você pode usar esse comportamento para expor metadados por HTTPS definindo HttpsGetEnabled como true. Isso requer um endereço base HTTPS.

Para acessar o ponto de extremidade MEX do serviço, use a ServiceModel Metadata Utility Tool (Svcutil.exe).

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs

Isso gera um cliente com base nos metadados do serviço.

Para acessar os metadados do serviço usando HTTP GET, aponte o navegador para http://localhost/servicemodelsamples/service.svc?wsdl.

Se você remover esse comportamento e tentar abrir o serviço, obterá uma exceção. Este erro ocorre porque, sem o comportamento, o ponto de extremidade configurado com o IMetadataExchange contrato não tem implementação.

Se você definir HttpGetEnabled como false, verá a página de ajuda do CalculatorService em vez de ver os metadados do serviço.

Para configurar, compilar e executar o exemplo

  1. Certifique-se de ter executado o procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para criar a edição C# ou Visual Basic .NET da solução, siga as instruções em Criando os exemplos do Windows Communication Foundation.

  3. Para executar o exemplo em uma configuração de máquina única ou cruzada, siga as instruções em Executando os exemplos do Windows Communication Foundation.