Compartir a través de


Recuperar metadatos

El ejemplo RetrieveMetadata muestra cómo implementar un cliente que recupera dinámicamente los metadatos de un servicio para elegir un punto de conexión con el que comunicarse. Este ejemplo se basa en la introducción. El servicio se ha modificado para exponer dos puntos de conexión: un punto de conexión en la dirección base mediante el basicHttpBinding enlace y un punto de conexión seguro en {baseaddress}/secure mediante el wsHttpBinding enlace. En lugar de configurar el cliente con las direcciones y enlaces del punto de conexión, el cliente recupera dinámicamente los metadatos del servicio mediante la MetadataExchangeClient clase y, a continuación, importa los metadatos como un ServiceEndpointCollection mediante la WsdlImporter clase .

Nota:

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

La aplicación cliente usa el importado ServiceEndpointCollection para crear clientes para comunicarse con el servicio. La aplicación cliente recorre en iteración cada punto de conexión recuperado y se comunica con cada punto de conexión que implementa el ICalculator contrato. La dirección y el enlace adecuados se proporcionan con el punto de conexión recuperado, de modo que el cliente esté configurado para comunicarse con cada punto de conexión, como se muestra en el código de ejemplo siguiente.

// 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();
    }
}

La ventana de la consola del cliente muestra las operaciones enviadas a cada uno de los puntos de conexión, mostrando la ruta de dirección y el nombre de enlace.

Para configurar, compilar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.

  2. Para compilar la edición de .NET de C#, C++o Visual Basic de la solución, siga las instrucciones de Creación de ejemplos de Windows Communication Foundation.

  3. Para ejecutar el ejemplo en una configuración de una máquina única o entre máquinas, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.