Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В примере 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();
}
}
В окне консоли клиента отображаются операции, отправляемые на каждую из конечных точек, отображая путь адреса и имя привязки.
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Чтобы создать версии решения C#, C++, или Visual Basic .NET, выполните инструкции по созданию примеров Windows Communication Foundation.
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в запуска примеров Windows Communication Foundation.