上面的内容大部分是围绕着Ad-Hoc模式展开介绍的。Managed模式和Ad-Hoc不同之处在于可用服务的终结点通过发现代理来统一管理。客户端在进行可用目标服务探测和解析的时候不再需要发送广播请求,而是直接向发现代理进行探测和解析请求就可以了。[源代码从这里下载]
目录
一、发现代理与Managed发现模式
二、通过继承DiscoveryProxy创建发现代理
三、实例演示:自定义发现代理服务
步骤一、创建自定义发现代理服务
步骤二、寄宿发现代理服务和目标服务
步骤三、服务的动态调用
至于发现服务如何进行可用服务的实时维护,则是具体实现上的选择问题。不过WS-Discovery通过目标服务的通知机制来解决发现代理维护的服务的实时可用性。具体来说就是赋予了发现代理监听服务上下线通知的能力,并根据接收到的通知来进行可用服务的动态注册和注销。不过与Ad-Hoc模式下采用广播模式的通知不同,在Managed模式下,目标服务只需要专门针对发现代理发送通知就可以了。
在Ad-Hoc模式下,我们采用UdpAnnouncementEndpoint实现了广播式的通知,而在Managed模式则直接使用AnnouncementEndpoint终结点进行单播式的通知。该终结点的地址就是发现代理的地址。同理,在Ad-Hoc模式下我们进行广播式服务探测和解析是通过UdpDiscoveryEndpoint终结点来进行的,在Managed模式下我们可以直接使用DiscoveryEndpoint终结点实现客户端向发现代理单方面的可用服务的探测和解析请求。
发现代理部仅仅局限于Managed模式,同样可以使用在Ad-Hoc模式下。在Ad-Hoc模式下,发现代理可以像目标服务一样监听来自客户端发出的广播式的Probe/Resolve请求,也可以像客户端一样监听来自服务端发出的广播式的Helle/Bye通知。所以UdpDiscoveryEndpoint和UdpAnnouncementEndpoint同样可以应用在发现代理上。
发现代理本质上就是一个服务,它的核心功能就是接收客户端发送的针对可用服务探测和解析的Probe/Resolve请求,并回复以相应的PM和RM消息。至于上面提到的对目标服务上/下线通知监听能力只是具体实现对可用服务维护的一种方式而已。
二、通过继承DiscoveryProxy创建发现代理
发现服务本质上就是一个WCF服务,并且这个服务实现的服务契约定义的操作应该基于定义在WS-Discovery中的几种基本的消息交换:Probe/PM、Resolve/RM和Hello/Bye。交换的消息在针对不同版本的WS-Discovery(WSDiscoveryApril2005、WSDiscovery11和WSDiscoveryCD1)又具有不同的要求。即使针对某个具体版本的WS-Discovery,Probe/PM和Resolve/RM的消息也会因采用Ad-Hoc或者Managed模式又有所不同。如果你需要创建一个同时支持不同版本WS-Discovery的发现代理服务,就应该实现DiscoveryEndpoint和AnnouncementEndpoint终结点所实现的所有服务契约。
所以说要自己从头到尾去定义这么一个发现代理服务并不是一件容易的事情。为了使开发人员可以无需关注具体的消息交换的细节,帮助他们容易的定义发现代理,WCF提供了一个抽象类DiscoveryProxy。我们只需要将我们自定义的发现代理服务类型继承该类并且重写相应的方法就可以了。
下面的代码给出了DiscoveryProxy的核心方法的定义。正如我们上面的分析,作为一个完备的发现代理服务应该实现DiscoveryEndpoint和AnnouncementEndpoint终结点所实现的所有服务契约,在这里得到了证实。DiscoveryProxy定义了4组抽象的OnBegingXxx/OnEndXxx方法,分别针四个基本的服务发现操作(消息交换):服务探测(Probe/PM)、服务解析(Resolve/RM)、上线通知(Hello)和离线通知(Bye)。作为继承自DiscoveryProxy的自定义发现代理服务,只需要重写这些抽象方法既可。
2: IAnnouncementContractApril2005,
3: IAnnouncementContract11,
4: IAnnouncementContractCD1,
5: IDiscoveryContractAdhocApril2005,
6: IDiscoveryContractManagedApril2005,
7: IDiscoveryContractApril2005,
8: IDiscoveryContractAdhoc11,
9: IDiscoveryContractManaged11,
10: IDiscoveryContractAdhocCD1,
11: IDiscoveryContractManagedCD1, ...
12: {
//Find(Probe)
object state);
void OnEndFind(IAsyncResult result);
16:
//Resolve
object state);
abstract EndpointDiscoveryMetadata OnEndResolve(IAsyncResult result);
20:
//Online Announcement(Hello)
abstract IAsyncResult OnBeginOnlineAnnouncement(DiscoveryMessageSequence messageSequence, EndpointDiscoveryMetadata
object state);
void OnEndOnlineAnnouncement(IAsyncResult result);
25:
//Offline Announcement(Bye)
abstract IAsyncResult OnBeginOfflineAnnouncement(DiscoveryMessageSequence messageSequence, EndpointDiscoveryMetadata
object state);
void OnEndOfflineAnnouncement(IAsyncResult result);
30:
//其他成员
32: }