要让作为服务消费者的客户端能够动态地发现可用的服务,首先的要求服务本身具有可被发现的特性。那么到底一个可被发现的服务和一个一般的服务有何不同呢?或者说如何让一个一般的服务在寄宿的时候能够被它潜在的消费者“探测”到呢?
我们知道,WCF本质上就是消息交换的通信框架。不论是针对普通的服务操作的调用,还是定义在WS-Discovery中的服务的探测(Probe/PM)和解析(Resolve/RM),本质上都是一种消息的交换。它们并没有本质的不同,或者说唯一不同的就是消息的内容,前者是基于某个服务操作的请求和回复,而后者这是针对服务相关元信息的请求和回复。
从消息交换的角度讲,服务发现和元数据的获取比较类似,因为它们都交换的消息都关于服务本身的一些信息。在《如何将一个服务发布成WSDL》中,我们介绍了元数据的发布具有两种不同的方式:HTTP-GET和MEX终结点。服务发现机制对服务信息交换的实现与基于MEX终结点进行服务元数据交换的实现比较类似,因为它也需要一个特殊类型的终结点,即DiscoveryEndpoint。
在前面介绍“标准终结点”的时候,我们列出的一系列标准终结点列表中就有一个DiscoveryEndpoint。一个服务必须具有一个DiscoveryEndpoint才能成为一个可被发现的服务,而客户端也正是通过DiscoveryEndpoint来发现这相应的服务的。为了能够更加深刻地认识这个标准终结点,我们不妨先来看看它的定义。
class DiscoveryEndpoint : ServiceEndpoint
2: {
//其他成员
public DiscoveryEndpoint();
public DiscoveryEndpoint(Binding binding, EndpointAddress endpointAddress);
public DiscoveryEndpoint(DiscoveryVersion discoveryVersion, ServiceDiscoveryMode discoveryMode);
public DiscoveryEndpoint(DiscoveryVersion discoveryVersion, ServiceDiscoveryMode discoveryMode, Binding binding, EndpointAddress endpointAddress);
8:
public ServiceDiscoveryMode DiscoveryMode { get; }
public DiscoveryVersion DiscoveryVersion { get; }
public TimeSpan MaxResponseDelay { get; set; }
12: }