WCF 发现由一组类型组成,这些类型提供统一的编程模型,可用于编写运行时可发现的服务和查找和使用这些服务的客户端。
使服务可被发现和找到服务
若要使 WCF 服务可发现,请在服务主机的ServiceDiscoveryBehavior中添加ServiceDescription并添加发现终结点。 如果服务配置为发送公告消息(通过添加 AnnouncementEndpoint),则会在服务主机打开和关闭时发送公告。
想要侦听服务公告消息的客户端托管公告服务,并添加一个或多个公告终结点。 公告服务接收公告消息并引发公告事件。
客户端使用该 DiscoveryClient 类搜索可用服务。 客户端应用程序实例化 DiscoveryClient 该类,传入一个发现终结点,该终结点指定发送发现消息的位置。 客户端调用 Find 发送 Probe
请求的方法。 侦听发现消息的服务接收此 Probe
请求。 如果服务与中指定的 Probe
条件匹配,它会将消息 ProbeMatch
发送回客户端。
对象模型
WCF 发现 API 定义以下类:
AnnouncementClient
该 AnnouncementClient 类提供用于发送公告消息的同步和异步方法。 有两种类型的公告消息:Hello 和 Bye。 发送 Hello 消息以指示服务已可用,并发送 Bye 消息以指示现有服务不可用。 开发人员创建一个 AnnouncementClient 实例,并传递作为构造函数参数的实例 AnnouncementEndpoint 。
AnnouncementEndpoint
AnnouncementEndpoint 表示具有固定公告协议的标准终结点。 服务或客户端使用它发送和接收公告消息。 默认情况下,该 AnnouncementEndpoint 类设置为使用 WS_Discovery 11 协议版本。
AnnouncementService
AnnouncementService 是一种系统提供的公告服务实现,用于接收和处理公告消息。 收到 Hello 或 Bye 消息时, AnnouncementService 实例将调用相应的虚拟方法 OnBeginOnlineAnnouncement ,或 OnBeginOfflineAnnouncement引发公告事件。
DiscoveryClient
客户端应用程序 DiscoveryClient 使用该类来查找和解析可用的服务。 它提供基于指定 FindCriteria 和 ResolveCriteria 分别查找和解析服务的同步和异步方法。 开发人员创建一个 DiscoveryClient 实例,并提供作为构造函数参数的 DiscoveryEndpoint 实例。
为了查找服务,开发人员调用同步或异步 Find
方法,该方法提供 FindCriteria 包含要使用的搜索条件的实例。
DiscoveryClient 创建具有相应标头的 Probe
消息,并发送查找请求。 由于随时可以有多个未完成 Find
的请求,客户端会关联收到的响应并验证响应。 然后,它使用 Find
将结果传递给 FindResponse 操作的调用方。
为了解析已知服务,开发人员调用同步或异步Resolve
方法,该方法提供实例ResolveCriteria,其中包含已知服务的EndpointAddress。
DiscoveryClient创建具有相应标头的Resolve
消息并发送解析请求。 收到的响应与未处理的解析请求相关联,结果将通过Resolve
传递给ResolveResponse操作的调用方。
如果网络上存在发现代理并且 DiscoveryClient 以多播方式发送发现请求,则发现代理可以使用多播抑制 Hello 消息进行响应。
DiscoveryClient 在接收到 Hello 消息时将引发 ProxyAvailable
事件,以便响应未处理的 Find
或 Resolve
请求。
ProxyAvailable
事件包含有关发现代理的 EndpointDiscoveryMetadata。 开发人员可以使用此信息从即席模式切换到托管模式。
DiscoveryEndpoint
DiscoveryEndpoint 表示具有固定发现协定的标准终结点。 服务或客户端使用它来发送或接收发现消息。 默认情况下, DiscoveryEndpoint 设置为使用 ServiceDiscoveryMode.Managed 模式和 WSDiscovery11 WS-Discovery 版本。
DiscoveryMessageSequenceGenerator
DiscoveryMessageSequenceGenerator 用于在服务发送发现或通知消息时生成 DiscoveryMessageSequence 消息。
DiscoveryService
DiscoveryService抽象类提供用于接收和处理Probe
和Resolve
消息的框架。
Probe
收到消息后,DiscoveryService创建基于传入消息的实例FindRequestContext并调用OnBeginFind虚拟方法。
Resolve
收到消息后,DiscoveryService调用OnBeginResolve虚拟方法。 可以从此类继承以提供自定义发现服务实现。
DiscoveryProxy
DiscoveryProxy抽象类提供用于接收和处理发现和公告消息的框架。 实现自定义发现代理时可以从此类继承。
Probe
当通过多播接收消息时,DiscoveryProxy类会调用BeginShouldRedirectFind
虚拟方法来确定是否应发送多播抑制消息。 如果开发人员决定不发送多播抑制消息,或者消息 Probe
通过单播接收,它将基于传入消息创建类的 FindRequestContext 实例并调用 OnBeginFind
虚拟方法。
Resolve
当通过多播接收消息时,类DiscoveryProxy将调用ShouldRedirectResolve
虚拟方法来确定是否应发送多播抑制消息。 如果开发人员决定不发送多播抑制消息,或者消息 Resolve
通过单播接收,它将基于传入消息创建类的 ResolveCriteria 实例并调用 OnBeginResolve
虚拟方法。 收到 Hello 或 Bye 消息时, DiscoveryProxy 调用引发公告事件的相应虚拟方法(OnBeginOnlineAnnouncement
或 OnBeingOfflineAnnouncement
)。
DiscoveryVersion
该 DiscoveryVersion 类表示要使用的发现协议版本。
EndpointDiscoveryBehavior
该 EndpointDiscoveryBehavior 类用于控制终结点的可发现性、指定扩展、附加协定类型名称。 以及与该终结点关联的作用域。 将此行为添加到应用程序终结点可以配置其 EndpointDiscoveryMetadata。 当 ServiceDiscoveryBehavior 添加到服务主机时,默认情况下,服务主机托管的所有应用程序终结点都会变得可发现。 开发人员可以通过将Enabled属性设置为false
来关闭特定终结点的发现功能。
EndpointDiscoveryMetadata
该 EndpointDiscoveryMetadata 类提供服务发布的终结点与版本无关的表示形式。 它包含终结点地址、侦听 URI、协定类型名称、范围、元数据版本和服务开发人员指定的扩展。 客户端在 FindCriteria 操作期间发送的 Probe
将与 EndpointDiscoveryMetadata 进行匹配。 如果条件匹配,则 EndpointDiscoveryMetadata 返回给客户端。 中的 ResolveCriteria 终结点地址与终结点 EndpointDiscoveryMetadata地址匹配 。 如果条件匹配,则 EndpointDiscoveryMetadata 返回给客户端。
FindCriteria
该 FindCriteria 类是一个与版本无关的类,用于指定查找服务时使用的条件。 它完全支持用于匹配服务的 WS-Discovery 定义条件。 它还具有扩展,开发人员可以使用这些扩展来指定可在匹配过程中使用的自定义值。 开发人员可以通过指定 Find
来为 MaxResults 操作提供终止条件,这指定了开发人员要查找的服务总数,或者通过指定 Duration 来指定客户端等待响应的时间的值。
FindRequestContext
发现服务根据客户端启动 FindRequestContext 操作时接收到的 Probe
消息来实例化 Find
类。 它包含客户端指定的实例 FindCriteria 。
FindResponse
FindResponse 类与 Find 操作的响应一起返回到 Find
的调用方。 它也存在于 FindCompletedEventArgs。 它包含一个集合EndpointDiscoveryMetadata,它是已发现的终结点的集合,以及一个字典EndpointDiscoveryMetadata和DiscoveryMessageSequence。
ResolveCriteria
该 ResolveCriteria 类是一个与版本无关的类,用于指定解析已知服务时使用的条件。 它包含已知服务的终结点地址。 开发人员可以通过指定 Duration 来提供解析操作的终止条件,该条件指定客户端等待响应的时间。
ResolveResponse
将 ResolveResponse 及 Resolve 操作的响应返回给 Resolve
方法的调用者。 它也存在于 ResolveCompletedEventArgs。 它包含EndpointDiscoveryMetadata的一个实例,代表发现的终结点,以及DiscoveryMessageSequence的一个实例。
ServiceDiscoveryBehavior
该 ServiceDiscoveryBehavior 类允许开发人员将发现功能添加到服务。 您可以将此行为添加到 ServiceHost。 ServiceDiscoveryBehavior 类遍历服务主机中的应用程序终结点,并从可发现的终结点创建一个 EndpointDiscoveryMetadata 集合。 默认情况下,所有终结点都可以发现。 可以通过在特定终结点添加 EndpointDiscoveryBehavior 来控制该终结点的可发现性。 如果添加 ServiceDiscoveryBehavior 公告终结点,则在服务主机打开或关闭时,会通过每个公告终结点发送所有可发现终结点的公告。
UdpAnnouncementEndpoint
该 UdpAnnouncementEndpoint 类是一个标准公告终结点,预配置为通过 UDP 多播绑定进行公告。 默认情况下, UdpAnnouncementEndpoint 设置为使用 WSApril2005 WS_Discovery 版本。
UdpDiscoveryEndpoint
该 UdpDiscoveryEndpoint 类是一个标准发现终结点,预配置为通过 UDP 多播绑定进行发现。 默认情况下, DiscoveryEndpoint 设置为使用 WSDiscovery11 WS-Discovery 版本和 ServiceDiscoveryMode.Adhoc 模式。