Freigeben über


Abrufen von Metadaten

Das RetrieveMetadata-Beispiel veranschaulicht, wie ein Client implementiert wird, der Metadaten dynamisch von einem Dienst abruft, um einen Endpunkt auszuwählen, mit dem kommuniziert werden soll. Dieses Beispiel basiert auf den Ersten Schritten. Der Dienst wurde geändert, um zwei Endpunkte verfügbar zu machen: einen Endpunkt an der Basisadresse mithilfe der basicHttpBinding Bindung und einen sicheren Endpunkt unter {baseaddress}/secure mithilfe der wsHttpBinding Bindung. Anstatt den Client mit den Endpunktadressen und -bindungen zu konfigurieren, ruft der Client dynamisch die Metadaten für den Dienst mithilfe der MetadataExchangeClient-Klasse ab und importiert dann die Metadaten als ServiceEndpointCollection unter Verwendung der WsdlImporter-Klasse.

Hinweis

Die Einrichtungsverfahren und Build-Anweisungen für dieses Beispiel befinden sich am Ende dieses Themas.

Die Clientanwendung verwendet den importierten ServiceEndpointCollection, um Clients zu erstellen und mit dem Dienst zu kommunizieren. Die Clientanwendung durchläuft jeden abgerufenen Endpunkt und kommuniziert mit jedem Endpunkt, der den ICalculator Vertrag implementiert. Die entsprechende Adresse und Bindung werden mit dem abgerufenen Endpunkt bereitgestellt, sodass der Client für die Kommunikation mit jedem Endpunkt konfiguriert ist, wie im folgenden Beispielcode gezeigt.

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

Im Clientkonsolenfenster werden die Vorgänge angezeigt, die an jeden Endpunkt gesendet werden, wobei der Adresspfad und der Bindungsname angezeigt werden.

So können Sie das Beispiel einrichten, erstellen und ausführen

  1. Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.

  2. Um die C#-, C++- oder Visual Basic .NET-Edition der Lösung zu erstellen, befolgen Sie die Anweisungen im Erstellen der Windows Communication Foundation-Beispiele.

  3. Wenn Sie das Beispiel in einer Konfiguration mit einem Computer oder über Computer hinweg ausführen möchten, folgen Sie den Anweisungen unter Durchführen der Windows Communication Foundation-Beispiele.