Dela via


Hämta metadata

Exemplet RetrieveMetadata visar hur du implementerar en klient som dynamiskt hämtar metadata från en tjänst för att välja en slutpunkt att kommunicera med. Det här exemplet baseras på Komma igång. Tjänsten har ändrats för att exponera två slutpunkter – en slutpunkt vid basadressen med bindningen basicHttpBinding och en säker slutpunkt vid {baseaddress}/secure med bindningen wsHttpBinding . I stället för att konfigurera klienten med slutpunktsadresser och bindningar hämtar klienten dynamiskt metadata för tjänsten med hjälp av MetadataExchangeClient klassen och importerar sedan metadata som en ServiceEndpointCollection med hjälp av WsdlImporter klassen.

Kommentar

Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.

Klientprogrammet använder importerade ServiceEndpointCollection för att skapa klienter för att kommunicera med tjänsten. Klientprogrammet itererar genom varje hämtad slutpunkt och kommunicerar med varje slutpunkt som implementerar ICalculator kontraktet. Lämplig adress och bindning tillhandahålls med den hämtade slutpunkten, så att klienten är konfigurerad för att kommunicera med varje slutpunkt, enligt följande exempelkod.

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

Klientkonsolfönstret visar de åtgärder som skickas till var och en av slutpunkterna och visar adresssökvägen och bindningsnamnet.

Så här konfigurerar du, skapar och kör exemplet

  1. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  2. Om du vill skapa C#,C++- eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

  3. Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.