Visão geral da arquitetura de metadados

O Windows Communication Foundation (WCF) fornece uma infraestrutura avançada para exportar, publicar, recuperar e importar metadados de serviço. Os serviços WCF usam metadados para descrever como interagir com os pontos de extremidade do serviço para que ferramentas, como Svcutil.exe, possam gerar automaticamente o código do cliente para acessar o serviço.

A maioria dos tipos que compõem a infraestrutura de metadados do WCF reside no System.ServiceModel.Description namespace.

WCF usa a ServiceEndpoint classe para descrever pontos de extremidade em um serviço. Você pode usar o WCF para gerar metadados para pontos de extremidade de serviço ou importar metadados de serviço para gerar ServiceEndpoint instâncias.

WCF representa os metadados de um serviço como uma instância do MetadataSet tipo, cuja estrutura está fortemente ligada ao formato de serialização de metadados definido em WS-MetadataExchange. O MetadataSet tipo agrupa os metadados de serviço reais, como documentos WSDL (Web Services Description Language), documentos de esquema XML ou expressões WS-Policy, como uma coleção de MetadataSection instâncias. Cada System.ServiceModel.Description.MetadataSection instância contém um dialeto de metadados específico e um identificador. A System.ServiceModel.Description.MetadataSection pode conter os seguintes itens em sua MetadataSection.Metadata propriedade:

Uma System.ServiceModel.Description.MetadataReference instância aponta para outro ponto de extremidade de troca de metadados (MEX) e System.ServiceModel.Description.MetadataLocation as instâncias apontam para um documento de metadados usando uma URL HTTP. O WCF suporta o uso de documentos WSDL para descrever pontos de extremidade de serviço, contratos de serviço, associações, padrões de troca de mensagens, mensagens e mensagens de falha implementadas por um serviço. Os tipos de dados usados pelo serviço são descritos em documentos WSDL usando o esquema XML. Para obter mais informações, consulte Importação e exportação de esquema. Você pode usar o WCF para exportar e importar extensões WSDL para comportamento de serviço, comportamentos de contrato e elementos de ligação que estendem a funcionalidade de um serviço. Para obter mais informações, consulte Exportando metadados personalizados para uma extensão WCF.

Exportando metadados de serviço

No WCF, a exportação de metadados é o processo de descrever pontos de extremidade de serviço e projetá-los em uma representação paralela e padronizada que os clientes podem usar para entender como usar o serviço. Para exportar metadados de ServiceEndpoint instâncias, use uma implementação da MetadataExporter classe abstrata. Uma System.ServiceModel.Description.MetadataExporter implementação gera metadados que são encapsulados em uma MetadataSet instância.

A System.ServiceModel.Description.MetadataExporter classe fornece uma estrutura para gerar expressões de política que descrevem os recursos e requisitos de uma ligação de ponto de extremidade e suas operações, mensagens e falhas associadas. Essas expressões de política são capturadas em uma PolicyConversionContext instância. Uma System.ServiceModel.Description.MetadataExporter implementação pode então anexar essas expressões de política aos metadados que gera.

As System.ServiceModel.Description.MetadataExporter chamadas em cada System.ServiceModel.Channels.BindingElement um que implementa a IPolicyExportExtension interface na ligação de um ServiceEndpoint ao gerar um PolicyConversionContext objeto para a System.ServiceModel.Description.MetadataExporter implementação usar. Você pode exportar novas asserções de política implementando a IPolicyExportExtension interface em suas implementações personalizadas do BindingElement tipo.

O WsdlExporter tipo é a implementação da System.ServiceModel.Description.MetadataExporter classe abstrata incluída no WCF. O WsdlExporter tipo gera metadados WSDL com expressões de política anexadas.

Para exportar metadados WSDL personalizados ou extensões WSDL para comportamentos de ponto de extremidade, comportamentos de contrato ou elementos de ligação em um ponto de extremidade de serviço, você pode implementar a IWsdlExportExtension interface. O WsdlExporter examina uma ServiceEndpoint instância para elementos de ligação, comportamentos de operação, comportamentos de contrato e comportamentos de ponto de extremidade que implementam a IWsdlExportExtension interface ao gerar o documento WSDL.

Metadados do Serviço de Publicação

Os serviços WCF publicam metadados expondo um ou mais pontos de extremidade de metadados. A publicação de metadados de serviço disponibiliza metadados de serviço usando protocolos padronizados, como solicitações MEX e HTTP/GET. Os pontos de extremidade de metadados são semelhantes a outros pontos de extremidade de serviço, pois têm um endereço, uma vinculação e um contrato. Você pode adicionar pontos de extremidade de metadados a um host de serviço na configuração ou no código.

Para publicar pontos de extremidade de metadados para um serviço WCF, você deve primeiro adicionar uma instância do ServiceMetadataBehavior comportamento de serviço ao serviço. Adicionar uma System.ServiceModel.Description.ServiceMetadataBehavior instância ao seu serviço aumenta o serviço com a capacidade de publicar metadados expondo um ou mais pontos de extremidade de metadados. Depois de adicionar o comportamento do System.ServiceModel.Description.ServiceMetadataBehavior serviço, você pode expor pontos de extremidade de metadados que suportam o protocolo MEX ou pontos de extremidade de metadados que respondem a solicitações HTTP/GET.

Para adicionar pontos de extremidade de metadados que usam o protocolo MEX, adicione pontos de extremidade de serviço ao host de serviço que usam o contrato de serviço chamado IMetadataExchange.WCF define a IMetadataExchange interface que tem esse nome de contrato de serviço. Os pontos de extremidade WS-MetadataExchange, ou pontos de extremidade MEX, podem usar uma das quatro associações padrão expostas pelos métodos estáticos de fábrica na MetadataExchangeBindings classe para corresponder às associações padrão usadas pelas ferramentas WCF, como Svcutil.exe. Você também pode configurar pontos de extremidade de metadados MEX usando uma associação personalizada.

O ServiceMetadataBehavior usa a System.ServiceModel.Description.WsdlExporter para exportar metadados para todos os pontos de extremidade de serviço em seu serviço. Para obter mais informações sobre como exportar metadados de um serviço, consulte Exportando e importando metadados.

O ServiceMetadataBehavior aumenta seu host de serviço adicionando uma ServiceMetadataExtension instância como uma extensão ao seu host de serviço. O System.ServiceModel.Description.ServiceMetadataExtension fornece a implementação para os protocolos de publicação de metadados. Você também pode usar o System.ServiceModel.Description.ServiceMetadataExtension para obter os metadados do serviço em tempo de execução acessando a Metadata propriedade.

Atenção

Se você adicionar um ponto de extremidade MEX no arquivo de configuração do aplicativo e, em seguida, tentar adicionar o ServiceMetadataBehavior ao seu host de serviço no código, obterá a seguinte exceção:

System.InvalidOperationException: O nome do contrato 'IMetadataExchange' não pôde ser encontrado na lista de contratos implementados pelo serviço Service1. Adicione um ServiceMetadataBehavior ao arquivo de configuração ou ao ServiceHost diretamente para habilitar o suporte para este contrato.

Você pode contornar esse problema adicionando o ServiceMetadataBehavior no arquivo de configuração ou adicionando o ponto de extremidade e ServiceMetadataBehavior no código.

Para obter um exemplo de adição ServiceMetadataBehavior em um arquivo de configuração do aplicativo, consulte Introdução. Para obter um exemplo de adição ServiceMetadataBehavior de código, consulte o Exemplo de Self-Host .

Atenção

Ao publicar metadados para um serviço que expõe dois contratos de serviço diferentes, nos quais cada um contém uma operação com o mesmo nome, uma exceção é lançada. Por exemplo, se você tiver um serviço que expõe um contrato de serviço chamado ICarService que tem uma operação Get(Car c) e o mesmo serviço expõe um contrato de serviço chamado IBookService que tem uma operação Get(Book b), uma exceção é lançada ou uma mensagem de erro é exibida ao gerar os metadados do serviço. Para contornar esse problema, siga um destes procedimentos:

  • Renomeie uma das operações.
  • Defina o Name para um nome diferente.
  • Defina um dos namespaces das operações para um namespace diferente usando a Namespace propriedade.

Recuperando metadados do serviço

O WCF pode recuperar metadados de serviço usando protocolos padronizados, como WS-MetadataExchange e HTTP. Ambos os protocolos são suportados MetadataExchangeClient pelo tipo. Você recupera metadados de serviço usando o System.ServiceModel.Description.MetadataExchangeClient tipo fornecendo um endereço e uma associação opcional. A associação usada por uma System.ServiceModel.Description.MetadataExchangeClient instância pode ser uma das associações padrão da MetadataExchangeBindings classe estática, uma associação fornecida pelo usuário ou uma associação carregada de uma configuração de ponto de extremidade para o IMetadataExchange contrato. O System.ServiceModel.Description.MetadataExchangeClient também pode resolver referências de URL HTTP para metadados usando o HttpWebRequest tipo.

Por padrão, uma System.ServiceModel.Description.MetadataExchangeClient instância é vinculada a uma única ChannelFactoryBase instância. Você pode alterar ou substituir a ChannelFactoryBase instância usada por um System.ServiceModel.Description.MetadataExchangeClient substituindo o GetChannelFactory método virtual. Da mesma forma, você pode alterar ou substituir a System.Net.HttpWebRequest instância usada por a System.ServiceModel.Description.MetadataExchangeClient para fazer solicitações HTTP/GET substituindo o MetadataExchangeClient.GetWebRequest método virtual.

Você pode recuperar metadados de serviço usando solicitações WS-MetadataExchange ou HTTP/GET usando a ferramenta Svcutil.exe e passando a opção /target:metadata e um endereço. Svcutil.exe baixa os metadados no endereço especificado e salva os arquivos no disco. Svcutil.exe usa uma System.ServiceModel.Description.MetadataExchangeClient instância internamente e carrega uma configuração de ponto de extremidade MEX (do arquivo de configuração do aplicativo) cujo nome corresponde ao esquema do endereço passado para Svcutil.exe, se existir. Caso contrário, Svcutil.exe usa como padrão uma das associações definidas pelo MetadataExchangeBindings tipo de fábrica estática.

Importando metadados de serviço

No WCF, a importação de metadados é o processo de gerar uma representação abstrata de um serviço ou de suas partes componentes a partir de seus metadados. Por exemplo, o WCF pode importar ServiceEndpoint instâncias, Binding instâncias ou ContractDescription instâncias de um documento WSDL para um serviço. Para importar metadados de serviço no WCF, use uma implementação da MetadataImporter classe abstrata. Os tipos que derivam da classe implementam suporte System.ServiceModel.Description.MetadataImporter para importar formatos de metadados que aproveitam a lógica de importação WS-Policy no WCF.

Uma System.ServiceModel.Description.MetadataImporter implementação coleta as expressões de política anexadas aos metadados de serviço em um PolicyConversionContext objeto. O System.ServiceModel.Description.MetadataImporter então processa as políticas como parte da importação dos metadados chamando as implementações da IPolicyImportExtension interface na PolicyImportExtensions propriedade.

Você pode adicionar suporte para importar novas asserções de política a adicionando System.ServiceModel.Description.MetadataImporter sua própria implementação da IPolicyImportExtension interface à PolicyImportExtensions coleção em uma System.ServiceModel.Description.MetadataImporter instância. Como alternativa, você pode registrar sua extensão de importação de política no arquivo de configuração do aplicativo cliente.

O System.ServiceModel.Description.WsdlImporter tipo é a implementação da System.ServiceModel.Description.MetadataImporter classe abstrata incluída no WCF. O System.ServiceModel.Description.WsdlImporter tipo importa metadados WSDL com políticas anexadas que são agrupadas em um MetadataSet objeto.

Você pode adicionar suporte para importar extensões WSDL implementando a IWsdlImportExtension interface e, em seguida, adicionando sua implementação à WsdlImportExtensions propriedade em sua System.ServiceModel.Description.WsdlImporter instância. O System.ServiceModel.Description.WsdlImporter também pode carregar implementações da interface registrada em seu arquivo de configuração do System.ServiceModel.Description.IWsdlImportExtension aplicativo cliente.

Ligações dinâmicas

Você pode atualizar dinamicamente a associação que usa para criar um canal para um ponto de extremidade de serviço caso a associação para o ponto de extremidade seja alterada ou você queira criar um canal para um ponto de extremidade que usa o mesmo contrato, mas tem uma associação diferente. Você pode usar a MetadataResolver classe static para recuperar e importar metadados em tempo de execução para pontos de extremidade de serviço que implementam um contrato específico. Em seguida, você pode usar os objetos importados System.ServiceModel.Description.ServiceEndpoint para criar um cliente ou fábrica de canais para o ponto de extremidade desejado.

Consulte também