Metaadatok lekérése
A RetrieveMetadata minta bemutatja, hogyan implementálhat egy olyan ügyfelet, amely dinamikusan lekéri a metaadatokat egy szolgáltatásból egy végpont kiválasztásához, amellyel kommunikálni szeretne. Ez a minta az első lépéseken alapul. A szolgáltatás úgy lett módosítva, hogy két végpontot tegyen elérhetővé : egy végpontot az alapcímen a kötés használatával, és egy biztonságos végpontot a basicHttpBinding
({baseaddress}) helyen/biztonságos helyen a wsHttpBinding
kötés használatával. Ahelyett, hogy a végpontcímekkel és kötésekkel konfigurálja az ügyfelet, az ügyfél dinamikusan lekéri a szolgáltatás metaadatait az MetadataExchangeClient osztály használatával, majd importálja a metaadatokat ServiceEndpointCollection az WsdlImporter osztály használatával.
Feljegyzés
A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.
Az ügyfélalkalmazás az importált ServiceEndpointCollection használatával hoz létre ügyfeleket a szolgáltatással való kommunikációhoz. Az ügyfélalkalmazás minden lekért végponton keresztül iterál, és kommunikál a ICalculator
szerződést megvalósító végpontokkal. A megfelelő címet és kötést a lekért végpont biztosítja, hogy az ügyfél konfigurálva legyen az egyes végpontokkal való kommunikációra, ahogyan az az alábbi mintakódban látható.
// 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();
}
}
Az ügyfélkonzol ablaka megjeleníti az egyes végpontoknak küldött műveleteket, és megjeleníti a cím elérési útját és a kötés nevét.
A minta beállítása, összeállítása és futtatása
Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták egyszeri beállítási eljárását.
A megoldás C#, C++ vagy Visual Basic .NET kiadásának létrehozásához kövesse a Windows Communication Foundation-minták készítésének utasításait.
Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat.