先讲一个寻人启事的故事。
很久很久以前,他想寻一人,不得不知道她的所在地址,方能根据地址过去找到她。不幸的是,找到她了,但因操着不同语言而无法沟通,他又不得不找一个翻译来保证他与她之间的沟通顺利。很久很久以后,他想再寻一人却不知道她具体地址,他先守株待兔,看看她会不会突然冒出来和大家Say Hello,然后自己再跑上去搭讪。这种可能性貌似很小,除非她和自己一个小区。他拍脑袋一想,她如果在本市的话,肯定事先在派出所那边登记过资料了,于是就到拥有全市户口资料的派出所去打探,看看派出所那边能否提供她的资料并帮他们搭线上。
不得不承认,这是一个无聊的故事,和下面这个有的一拼。
WCF 3.5 中,当我们要调用一个服务时,必须事先知道该服务的地址,然后通过服务代理用双方约定好的契约与远程的服务进行交互。现在,WCF 4.0中提供了发现服务的支持,当我们再想调用一个服务时,没必要去知道该服务的具体地址,只需要利用 System.ServiceModel.Discovery 命名空间下的相关类就可以实现两种方式的动态发现服务:
Ad hoc Mode:简单理解,就是服务启动时就向网络广播Hello消息,调用方收到后进行回应建立通讯的模式。
Managed Mode:简单理解,就是所有服务事先在一个叫 Discovery Proxy 的地方登记,然后所有调用方发送查找请求给 Discovery Proxy 来查找并调用相关服务的模式。
这个故事到此为止,比喻不是很恰当,但至少可以有一个比较感性的认识吧。更详细,可以看下下面原理说明:
- WS-Discovery 1.1 规范:http://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html
- Discovery Concepts:http://blogs.msdn.com/discovery/archive/2009/05/29/discovery-overview.aspx
- WCF Discovery:http://msdn.microsoft.com/en-us/library/dd456782(VS.100).aspx
WCF 4.0中要动态发现服务,用 Ad hoc Mode 实现起来还是比较简单的,下面就以代码方式先看下如何实现。对于Managed Mode,就需要继承 System.ServiceModel.Discovery.DiscoveryProxy 抽象类去实现自己的 Discovery Proxy 了,这里先跳过不说了。
服务端:
- 在服务的Behavior中加入 System.ServiceModel.Discovery.ServiceDiscoveryBehavior。
- 添加一个服务端点 System.ServiceModel.Discovery.UdpDiscoveryEndpoint。
调用方:
- 如果使用生成的服务代理时:
- 用 System.ServiceModel.Discovery.DynamicEndpoint 根据服务契约和绑定来发现服务端点
- 通过生成的服务代理类调用服务。
- 如果使用 ChannelFactory<> 时:
- 通过 System.ServiceModel.Discovery.DiscoveryClient 去查找获取服务端点地址
- 用 ChannelFactory<> 根据绑定和服务端点地址调用服务。
打印 | 张贴于 2009-10-24 10:25:26 | Tag:暂无标签
留言反馈