擷取中繼資料
這個 RetrieveMetadata 範例會示範如何實作會動態擷取服務的中繼資料,以選擇要進行通訊之端點的用戶端。 這個範例以使用者入門為基礎。 服務已修改成公開兩個端點,一個是在基底位址使用 basicHttpBinding
繫結的端點,另一個是在 {baseaddress}/secure 使用 wsHttpBinding
繫結的安全端點。 此時用戶端並不是以端點位址與繫結設定,而是使用 MetadataExchangeClient 類別動態擷取服務的中繼資料,然後使用 ServiceEndpointCollection 類別將中繼資料當做 WsdlImporter 匯入。
注意
此範例的安裝程序與建置指示位於本主題的結尾。
用戶端應用程式會使用匯入的 ServiceEndpointCollection 以建立與服務通訊的用戶端。 用戶端應用程式會逐一查看每個擷取的端點,並與每個會實作 ICalculator
合約的端點進行通訊。 適當的位址與繫結會隨同所擷取的端點提供,以便讓該用戶端設定成與每個端點通訊,如下列範例程式碼所示。
// 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();
}
}
用戶端主控台視窗會顯示傳送至每個端點的作業,並顯示位址路徑與繫結程序名稱。
若要安裝、建置及執行範例
若要建置方案的 C#、C++ 或 Visual Basic .NET 版本,請遵循 建置 Windows Communication Foundation 範例 (部分機器翻譯) 中的指示。
若要在單一或多部電腦組態中執行此範例,請遵循執行 Windows Communication Foundation 範例中的指示進行。