Comportamento de publicação de metadados

A amostra 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 os serviços WCF (Windows Communication Foundation) desabilita a publicação de metadados. Esse comportamento é seguro por padrão, mas também significa que não é possível usar uma ferramenta de importação de metadados (como o Svcutil.exe) para gerar o código 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, esta amostra demonstra como criar um ponto de extremidade de publicação de metadados não protegidos. Esses pontos de extremidade estão potencialmente disponíveis para os consumidores anônimos não autenticados, e é preciso tomar cuidado antes da implantação desses pontos de extremidade, a fim de garantir que a divulgação pública dos metadados de um serviço seja apropriada. Confira o Ponto de extremidade de metadados seguros personalizados para ver uma amostra que protege um ponto de extremidade de metadados.

A amostra baseia-se na Introdução, que implementa o contrato de serviço ICalculator. Nesta amostra, o cliente é um aplicativo de console (.exe) e o serviço é hospedado pelos Serviços de Informações da Internet (IIS).

Observação

O procedimento de instalação e as instruções de compilação dessa amostra estão no final deste tópico.

Para que um serviço exponha metadados, o ServiceMetadataBehavior deve ser configurado no serviço. Quando esse comportamento estiver presente, você poderá publicar metadados configurando um ponto de extremidade para expor o contrato IMetadataExchange como uma implementação de um protocolo MEX (WS-MetadataExchange). Por conveniência, este contrato recebeu o nome de configuração abreviado de "IMetadataExchange". Esta amostra usa o mexHttpBinding, que é uma associação padrão de conveniência equivalente à 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. O exemplo 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>

O exemplo 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 propriedade HttpGetEnabled 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 de consulta ?wsdl é usada no endereço base do serviço para acessar os metadados. Por exemplo, para ver o WSDL do 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 Ferramenta do Utilitário de Metadados do ServiceModel (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. Esse erro ocorre porque, sem o comportamento, o ponto de extremidade configurado com o contrato IMetadataExchange não tem implementação.

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

Para configurar, compilar, e executar o exemplo

  1. Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para compilar a edição .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.

  3. Para executar a amostra em uma configuração de computador único ou entre computadores, siga as instruções contidas em Como executar as amostras do Windows Communication Foundation.