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 rozpoczynaniu pracy. Usługa została zmodyfikowana w celu uwidocznienia dwóch punktów końcowych — punktu końcowego na adresie podstawowym przy użyciu basicHttpBinding
powiązania i bezpiecznego punktu końcowego w lokalizacji {baseaddress}/secure przy użyciu wsHttpBinding
powiązania. Zamiast konfigurować klienta przy użyciu adresów i powiązań punktów końcowych, klient dynamicznie pobiera metadane usługi przy użyciu MetadataExchangeClient klasy, a następnie importuje metadane jako klasę ServiceEndpointCollectionWsdlImporter .
Uwaga
Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.
Aplikacja kliencka używa zaimportowanych ServiceEndpointCollection elementów do tworzenia klientów w celu komunikowania się 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ład
Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.
Aby skompilować wersję rozwiązania W#, C++lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Kompilowanie przykładów programu Windows Communication Foundation.
Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.