Recuperar metadadosRetrieve Metadata

Este exemplo demonstra como implementar um cliente que recupera dinamicamente os metadados de um serviço para escolher um ponto de extremidade com o qual se comunicar.This sample demonstrates how to implement a client that dynamically retrieves metadata from a service to choose an endpoint with which to communicate. Este exemplo é baseado na introdução.This sample is based on the Getting Started. O serviço foi modificado para expor dois pontos de extremidade — um ponto de extremidades no endereço base usando a basicHttpBinding associação e um ponto de extremidade seguro em {BaseAddress}/Secure usando a wsHttpBinding associação.The service has been modified to expose two endpoints—an endpoint at the base address using the basicHttpBinding binding, and a secure endpoint at {baseaddress}/secure using the wsHttpBinding binding. Em vez de configurar o cliente com os endereços e associações de ponto de extremidade, o cliente recupera dinamicamente os metadados para o serviço usando a MetadataExchangeClient classe e, em seguida, importa os metadados como um ServiceEndpointCollection usando a WsdlImporter classe.Instead of configuring the client with the endpoint addresses and bindings, the client dynamically retrieves the metadata for the service using the MetadataExchangeClient class and then imports the metadata as a ServiceEndpointCollection using the WsdlImporter class.

Observação

O procedimento de instalação e as instruções de Build para este exemplo estão localizados no final deste tópico.The setup procedure and build instructions for this sample are located at the end of this topic.

O aplicativo cliente usa o importado ServiceEndpointCollection para criar clientes para se comunicar com o serviço.The client application uses the imported ServiceEndpointCollection to create clients to communicate with the service. O aplicativo cliente itera por meio de cada ponto de extremidade recuperado e se comunica com cada ponto de extremidade que implementa o ICalculator contrato.The client application iterates through each retrieved endpoint and communicates with each endpoint that implements the ICalculator contract. O endereço apropriado e a associação 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.The appropriate address and binding are provided with the retrieved endpoint, so that the client is configured to communicate with each endpoint, as shown in the following sample code.

// 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 pontos de extremidade, exibindo o caminho do endereço e o nome da associação.The client console window displays the operations sent to each of the endpoints, displaying the address path and binding name.

Para configurar, compilar, e executar o exemploTo set up, build, and run the sample

  1. Verifique se você executou o procedimento de configuração única para os exemplos de Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Para criar a edição C#, C++ ou Visual Basic .NET da solução, siga as instruções em criando os exemplos de Windows Communication Foundation.To build the C#, C++, or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Para executar o exemplo em uma configuração de computador único ou cruzado, siga as instruções em executando os exemplos de Windows Communication Foundation.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

Importante

Os exemplos podem já estar instalados no seu computador.The samples may already be installed on your machine. Verifique o seguinte diretório (padrão) antes de continuar.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se esse diretório não existir, vá para Windows Communication Foundation (WCF) e exemplos de Windows Workflow Foundation (WF) para .NET Framework 4 para baixar todos os Windows Communication Foundation (WCF) e WFWF exemplos.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Este exemplo está localizado no seguinte diretório.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Client\RetrieveMetadata