Использование клиентского канала обнаружения

При написании клиентского приложения WCF необходимо знать адрес конечной точки вызываемой службы. Во многих ситуациях адрес конечной точки службы не известен заранее или адрес службы изменяется со временем. Клиентский канал обнаружения позволяет создавать клиентское приложение WCF, описывать службу, которую вы хотите вызвать, и клиентский канал автоматически отправляет запрос пробы. Когда служба отвечает, клиентский канал обнаружения извлекает адрес конечной точки службы из ответа пробы и использует его для вызова службы.

Использование клиентского канала обнаружения

Чтобы использовать клиентский канал обнаружения, добавьте экземпляр DiscoveryClientBindingElement в ваш набор клиентских каналов. Вы можете использовать DynamicEndpoint, и DiscoveryClientBindingElement автоматически добавляется в вашу привязку, если он еще не присутствует.

Осторожность

Рекомендуется, чтобы DiscoveryClientBindingElement был самым верхним элементом в стеке клиентских каналов. Любой элемент привязки, добавленный поверх DiscoveryClientBindingElement, должен гарантировать, что ChannelFactory, создаваемый канал или канал не использует адрес конечной точки или Via адрес (переданный методу CreateChannel), так как они могут не содержать правильный адрес.

Класс DiscoveryClientBindingElement содержит два открытых свойства:

  1. FindCriteria, который используется для описания службы, которую требуется вызвать.

  2. DiscoveryEndpointProvider указывает конечную точку обнаружения для отправки сообщений об обнаружении.

Свойство FindCriteria() позволяет указать контракт службы, который вы ищете, все необходимые URI области и максимальное количество времени для открытия канала. Тип контракта указывается путем вызова конструктора FindCriteria. URI с областью можно добавить в свойство Scopes. Свойство MaxResults позволяет указать максимальное количество результатов, к которым клиент пытается подключиться. При получении ответа на запрос клиент пытается открыть канал, используя адрес конечной точки, указанный в этом ответе. Если исключение возникает, клиент переходит к следующему ответу пробы, ожидая получения дополнительных ответов при необходимости. Он продолжает делать это до тех пор, пока канал не будет успешно открыт или достигнуто максимальное количество результатов. Дополнительные сведения об этих параметрах см. в статье FindCriteria.

Свойство DiscoveryEndpointProvider позволяет указать используемую конечную точку обнаружения. Обычно это UdpDiscoveryEndpoint допустимая конечная точка, но она может быть любой другой допустимой конечной точкой.

При создании привязки для взаимодействия со службой необходимо тщательно использовать ту же привязку, что и служба. Единственное отличие заключается в том, что привязка клиента находится наверху стека с DiscoveryClientBindingElement на вершине. Если служба использует одну из системных привязок, создайте новый CustomBinding и передайте в конструктор привязку, предоставленную системой, CustomBinding. Затем можно добавить DiscoveryClientBindingElement, вызвав Insert на свойстве Elements.

После добавления DiscoveryClientBindingElement привязки и его настройки можно создать экземпляр клиентского класса WCF, открыть его и вызвать его методы. В следующем примере используется клиентский канал обнаружения для обнаружения службы WCF, реализующей ICalculator класс (используемый в руководстве по началу работы WCF) и вызывающий его Add метод.

// Create the DiscoveryClientBindingElement
DiscoveryClientBindingElement bindingElement = new DiscoveryClientBindingElement();
// Search for a service that implements the ICalculator interface, attempting to open
// the channel a maximum of 2 times
bindingElement.FindCriteria = new FindCriteria(typeof(ICalculator)) { MaxResults = 2 };
// Use the UdpDiscoveryEndpoint
bindingElement.DiscoveryEndpoint = new UdpDiscoveryEndpoint();

// The service uses the BasicHttpBinding, so use that and insert the DiscoveryClientBindingElement at the
// top of the stack
CustomBinding binding = new CustomBinding(new BasicHttpBinding());
binding.Elements.Insert(0,bindingElement);

try
{
    // Create the WCF client and call a method
    CalculatorClient client = new CalculatorClient(binding, new EndpointAddress("http://schemas.microsoft.com/dynamic"));
    client.Open();
    client.Add(1, 1);
}
catch (EndpointNotFoundException ex)
{
    Console.WriteLine("An exception occurred: " + ex.Message);
}

Безопасность и клиентский канал обнаружения

При использовании клиентского канала обнаружения указываются две конечные точки. Один используется для сообщений обнаружения, как правило UdpDiscoveryEndpoint, и другое — конечная точка приложения. При реализации безопасной службы необходимо обеспечить безопасность обеих конечных точек. Дополнительные сведения о безопасности см. в разделе "Защита служб и клиентов".