Образец элемента привязки для обнаружения
Данный образец демонстрирует использование клиентского элемента привязки обнаружения для обнаружения службы. Эта функция позволяет разработчикам добавлять клиентский канал обнаружения к клиентскому стеку каналов, в результате чего модель программирования становится намного интуитивно понятнее. Если соответствующий канал открыт, адрес службы разрешается в процессе обнаружения. Данный образец состоит из следующих проектов.
CalculatorService: доступная для обнаружения служба WCF.
CalculatorClient: клиентское приложение WCF, которое использует клиентский канал обнаружения для поиска и вызова службы CalculatorService.
DynamicCalculatorClient: клиентское приложение WCF, которое использует динамическую конечную точку для поиска и вызова службы CalculatorService.
![]() |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\WF_WCF_Samples
Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.
<диск_установки>:\WF_WCF_Samples\WCF\Basic\Discovery\DiscoveryBindingElement
|
CalculatorService
Данный проект содержит простую службу калькулятора, которая реализует контракт ICalculatorService
.
Следующий файл App.config используется для добавления поведения <serviceDiscovery> в набор поведений службы, а также конечной точки обнаружения.
<system.serviceModel>
<services>
<service behaviorConfiguration="CalculatorBehavior" name="Microsoft.Samples.Discovery.CalculatorService">
<endpoint name="udpDiscoveryEpt" kind="udpDiscoveryEndpoint" />
</service>
</services>
<behaviors>
<!--Enable discovery through configuration.-->
<serviceBehaviors>
<behavior name="CalculatorBehavior">
<serviceDiscovery>
</serviceDiscovery>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
При этом служба и ее конечные точки становятся доступными для обнаружения. Служба CalculatorService представляет собой саморазмещаемую службу, которая добавляет одну конечную точку с использованием привязки NetTcpBinding. Кроме того, она добавляет в конечную точку поведение EndpointDiscoveryBehavior
и указывает область, как показано в следующем примере кода.
// Add a NET.TCP endpoint and add a scope to that endpoint.
ServiceEndpoint netTcpEndpoint = serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new NetTcpBinding(), netTcpAddress);
EndpointDiscoveryBehavior netTctEndpointBehavior = new EndpointDiscoveryBehavior();
netTctEndpointBehavior.Scopes.Add(new Uri("ldap:///ou=engineering,o=exampleorg,c=us"));
netTcpEndpoint.Behaviors.Add(netTctEndpointBehavior);
serviceHost.Open();
CalculatorClient
Данный проект содержит реализацию клиента, которая отправляет сообщения службе CalculatorService. Эта программа использует метод CreateCustomBindingWithDiscoveryElement()
для создания пользовательской привязки, которая использует клиентский канал обнаружения.
static CustomBinding CreateCustomBindingWithDiscoveryElement()
{
DiscoveryClientBindingElement discoveryBindingElement = new DiscoveryClientBindingElement();
// Provide the search criteria and the endpoint over which the probe is sent
discoveryBindingElement.FindCriteria = new FindCriteria(typeof(ICalculatorService));
discoveryBindingElement.DiscoveryEndpointProvider = new UdpDiscoveryEndpointProvider();
CustomBinding customBinding = new CustomBinding(new NetTcpBinding());
// Insert DiscoveryClientBindingElement at the top of the BindingElement stack.
// An exception is thrown if this binding element is not at the top
customBinding.Elements.Insert(0, discoveryBindingElement);
return customBinding; }
После создания экземпляра DiscoveryClientBindingElement разработчик указывает критерии, используемые при поиске службы. В данном случае критерием обнаружения является тип ICalculatorService
. Кроме того, разработчик указывает поставщика DiscoveryEndpointProvider, который возвращает конечную точку DiscoveryEndpoint, указывающую место поиска служб. Поставщик DiscoveryEndpointProvider возвращает новый экземпляр конечной точки DiscoveryEndpoint. Дополнительные сведения см. в разделе Использование пользовательской привязки для клиентского канала обнаружения.
// Extend DiscoveryEndpointProvider class to change the default DiscoveryEndpoint
// to the DiscoveryClientBindingElement. The Discovery ClientChannel
// uses this endpoint to send Probe message.
public class UdpDiscoveryEndpointProvider : DiscoveryEndpointProvider
{
public override DiscoveryEndpoint GetDiscoveryEndpoint()
{
return new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005);
}
}
В данном случае клиент использует многоадресный механизм UDP, определенный в протоколе обнаружения, для поиска служб в локальной подсети. В оставшейся части метода создается пользовательская привязка, и элемент привязки обнаружения вставляется в верхушку стека.
![]() |
---|
Элемент DiscoveryClientBindingElement должен быть помещен в верхушку стека привязок. Любой элемент BindingElement, расположенный выше элемента DiscoveryClientBindingElement, должен удостовериться, что создаваемые им фабрики каналов и каналы не используют свойства EndpointAddress и Via, поскольку фактический адрес становится известным только на уровне клиентского канала обнаружения. |
После этого можно создать экземпляр CalculatorClient
, передав ему эту пользовательскую привязку и адрес конечной точки.
CalculatorServiceClient client = new CalculatorServiceClient(CreateCustomBindingWithDiscoveryElement(), DiscoveryClientBindingElement.DiscoveryEndpointAddress);
При использовании клиентского канала привязки передается постоянный адрес конечной точки, заданный ранее. Теперь во время выполнения клиентский канал обнаружения находит службу, заданную критерием поиска, и соединяется с ней. Для установления соединения между службой и клиентом они также должны иметь один и тот же базовый стек привязок.
Использование этого образца
Откройте решение в среде Visual Studio 2010.
Постройте решение.
Запустите приложение службы и каждое из клиентских приложений.
Заметьте, что клиенту удалось найти службу, не зная ее адреса.