Udostępnij przez


Pobieranie metadanych

W przykładzie RetrieveMetadata pokazano, jak zaimplementować klienta, który dynamicznie pobiera metadane z usługi, aby wybrać punkt końcowy, z którym ma się komunikować. Ten przykład jest oparty na Rozpoczynanie. Usługa została zmodyfikowana w celu uwidocznienia dwóch punktów końcowych — punktu końcowego pod adresem podstawowym za pomocą powiązania basicHttpBinding i bezpiecznego punktu końcowego pod adresem {baseaddress}/secure za pomocą powiązania wsHttpBinding. Zamiast konfigurować klienta przy użyciu adresów i powiązań punktów końcowych, klient dynamicznie pobiera metadane usługi przy użyciu klasy MetadataExchangeClient, a następnie importuje metadane jako klasy ServiceEndpointCollectionWsdlImporter.

Uwaga / Notatka

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

Aplikacja kliencka używa zaimportowanego ServiceEndpointCollection do tworzenia klientów do komunikacji z usługą. Aplikacja kliencka iteruje za pośrednictwem każdego pobranego punktu końcowego i komunikuje się z każdym punktem końcowym, który implementuje ICalculator kontrakt. Odpowiedni adres i powiązanie są dostarczane z pobranym punktem końcowym, dzięki czemu klient jest skonfigurowany do komunikowania się z każdym punktem końcowym, jak pokazano w poniższym przykładowym kodzie.

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

W oknie konsoli klienta są wyświetlane operacje wysyłane do każdego z punktów końcowych, wyświetlając ścieżkę adresu i nazwę powiązania.

Aby skonfigurować, skompilować i uruchomić przykładowy program

  1. Upewnij się, że wykonano procedurę instalacji One-Time dla przykładów programu Windows Communication Foundation.

  2. Aby zbudować wersję rozwiązania C#, C++, lub Visual Basic .NET, postępuj zgodnie z instrukcjami w Kompilowanie przykładów programu Windows Communication Foundation.

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w Uruchamianie przykładów programu Windows Communication Foundation.