Recuperar metadados

O exemplo RetrieveMetadata demonstra como implementar um cliente que recupera dinamicamente metadados de um serviço para escolher um ponto de extremidade com o qual se comunicar. Este exemplo é baseado na Introdução. O serviço foi modificado para expor dois pontos de extremidade: um ponto de extremidade no endereço base usando a associação basicHttpBinding e um ponto de extremidade seguro em {baseaddress}/secure usando a associação wsHttpBinding. Em vez de configurar o cliente com os endereços e ligações do ponto de extremidade, o cliente recupera dinamicamente os metadados do serviço usando a classe MetadataExchangeClient e, em seguida, importa os metadados como um ServiceEndpointCollection usando a classe WsdlImporter.

Observação

O procedimento de instalação e as instruções de build desse exemplo estão no final deste tópico.

O aplicativo cliente usa ServiceEndpointCollection importado para criar clientes para se comunicar com o serviço. O aplicativo cliente itera por meio de cada ponto de extremidade recuperado e se comunica com cada ponto de extremidade que implementa o contrato ICalculator. O endereço e a associação apropriados são fornecidos com o ponto de extremidade recuperado, para que o cliente seja configurado para se comunicar com cada ponto de extremidade, conforme mostrado no código de exemplo a seguir.

// Create a MetadataExchangeClient for retrieving metadata.
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);

// Retrieve the metadata for all endpoints using metadata exchange protocol (mex).
MetadataSet metadataSet = mexClient.GetMetadata();

//Convert the metadata into endpoints.
WsdlImporter importer = new WsdlImporter(metadataSet);
ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();

CalculatorClient client = null;
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
// Communicate with each endpoint that supports the ICalculator contract.
foreach (ServiceEndpoint ep in endpoints)
{
    if (ep.Contract.Namespace.Equals(contract.Namespace) && ep.Contract.Name.Equals(contract.Name))
    {
        // Create a client using the endpoint address and binding.
        client = new CalculatorClient(ep.Binding, new EndpointAddress(ep.Address.Uri));
        Console.WriteLine("Communicate with endpoint: ");
        Console.WriteLine("   AddressPath={0}", ep.Address.Uri.PathAndQuery);
        Console.WriteLine("   Binding={0}", ep.Binding.Name);
        // Call operations.
        DoCalculations(client);

        //Closing the client gracefully closes the connection and cleans up resources.
        client.Close();
    }
}

A janela do console do cliente exibe as operações enviadas para cada um dos terminais, exibindo o caminho do endereço e o nome da associaçã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 C#, C++ ou Visual Basic .NET da solução, siga as instruções em Como compilar os exemplos do Windows Communication Foundation.

  3. Para executar o exemplo em uma configuração de computador único ou cruzado, siga as instruções em Como executar os exemplos do Windows Communication Foundation.