Compartilhar 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 dos serviços do WCF (Windows Communication Foundation) 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 protegido. Esses pontos de extremidade estão potencialmente disponíveis para consumidores anônimos não autenticados e devem ser tomados cuidados antes de implantar esses pontos de extremidade para 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.

O exemplo é baseado no Guia de Início, que implementa o ICalculator contrato de serviço. 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 build para este exemplo estão localizados no final deste tópico.

Para que um serviço exponha metadados, ele 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). Como conveniência, esse contrato recebeu o nome de configuração abreviado de "IMetadataExchange". Este exemplo usa a mexHttpBindingassociação padrão , 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 endpoint, que, quando comparado com o endereço base dos serviços, resulta em um endereço de endpoint de http://localhost/servicemodelsamples/service.svc/mex. O seguinte mostra a configuração de 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 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 string de consulta ?wsdl é 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 configurando o elemento HttpsGetEnabled como true. Isso requer um endereço base HTTPS.

Para acessar o ponto de extremidade MEX do serviço, use a Ferramenta Utilitária 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 IMetadataExchange contrato não tem nenhuma 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 avulsa dos 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 o exemplo em uma configuração única ou entre máquinas, siga as instruções em Executando os exemplos do Windows Communication Foundation.