Microsoft .NET Framework 3.5 对 Windows Communication Foundation (WCF) 的全部 可能调用均具有两个限制。第一个限制是,分配给服务的端口或管道必须可用。因此,应用 程序开发人员或管理员必须试想或者提供某种方法,以保留这些端口或管道。第二个限制是 ,客户端必须提前知道服务端点地址,包括端口号和服务器或管道名称。
最理想的情况是,服务能够使用任何可用地址。反过来,客户端就需要在运行时发现此地 址。事实上,存在一种基于行业标准的解决方案,用于规定此发现的定位方式。本专栏的主 题就是该解决方案(简称为“发现”)及其支持机制。同时,我还会介绍几个有用的工具和 帮助程序类。这些内容的源代码,可在 code.msdn 中找到。
地址发现
发现依赖于用户数据报协议 (UDP)。与传输控制协议 (TCP) 不同,UDP 是无连接协议, 在数据包发送者和接收者之间不需要建立直接连接。客户端使用 UDP 传播对任何支持指定约 定类型的端点的发现请求。服务所支持的专门发现端点将接收这些请求。发现端点的实现将 响应客户端,以提供支持指定约定的服务端点的地址。客户端发现服务后将对其进行调用, 与常规 WCF 调用相同。有关该过程,在图 1 中进行了演示。
图 1 通过 UDP 的发现地址
与元数据交换 (MEX) 端点非常类似,WCF 提供了类型为 UdpDiscoveryEndpoint 的标准 发现端点:
public class DiscoveryEndpoint : ServiceEndpoint
{...}
public class UdpDiscoveryEndpoint : DiscoveryEndpoint
{...}
通过在服务支持的行为集合中添加 ServiceDiscoveryBehavior,可以使主机实现该端点 。可以通过以下编程方式实现此目的:
ServiceHost host = new ServiceHost(...);
host.AddServiceEndpoint(new UdpDiscoveryEndpoint());
ServiceDiscoveryBehavior discovery = new ServiceDiscoveryBehavior();
host.Description.Behaviors.Add(discovery);
host.Open();
图 2 显示如何使用服务配置文件添加发现端点和发现行为。
图 2 在配置文件中添加发现端点
<services>
<service name = "MyService">
<endpoint
kind = "udpDiscoveryEndpoint"
/>
...
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDiscovery/>
</behavior>
</serviceBehaviors>
</behaviors>