WCF 发现对象模型

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 使用该类来查找和解析可用的服务。 它提供基于指定 FindCriteriaResolveCriteria 分别查找和解析服务的同步和异步方法。 开发人员创建一个 DiscoveryClient 实例,并提供作为构造函数参数的 DiscoveryEndpoint 实例。

为了查找服务,开发人员调用同步或异步 Find 方法,该方法提供 FindCriteria 包含要使用的搜索条件的实例。 DiscoveryClient 创建具有相应标头的 Probe 消息,并发送查找请求。 由于随时可以有多个未完成 Find 的请求,客户端会关联收到的响应并验证响应。 然后,它使用 Find 将结果传递给 FindResponse 操作的调用方。

为了解析已知服务,开发人员调用同步或异步Resolve方法,该方法提供实例ResolveCriteria,其中包含已知服务的EndpointAddressDiscoveryClient创建具有相应标头的Resolve消息并发送解析请求。 收到的响应与未处理的解析请求相关联,结果将通过Resolve传递给ResolveResponse操作的调用方。

如果网络上存在发现代理并且 DiscoveryClient 以多播方式发送发现请求,则发现代理可以使用多播抑制 Hello 消息进行响应。 DiscoveryClient 在接收到 Hello 消息时将引发 ProxyAvailable 事件,以便响应未处理的 FindResolve 请求。 ProxyAvailable 事件包含有关发现代理的 EndpointDiscoveryMetadata。 开发人员可以使用此信息从即席模式切换到托管模式。

DiscoveryEndpoint

DiscoveryEndpoint 表示具有固定发现协定的标准终结点。 服务或客户端使用它来发送或接收发现消息。 默认情况下, DiscoveryEndpoint 设置为使用 ServiceDiscoveryMode.Managed 模式和 WSDiscovery11 WS-Discovery 版本。

DiscoveryMessageSequenceGenerator

DiscoveryMessageSequenceGenerator 用于在服务发送发现或通知消息时生成 DiscoveryMessageSequence 消息。

DiscoveryService

DiscoveryService抽象类提供用于接收和处理ProbeResolve消息的框架。 Probe收到消息后,DiscoveryService创建基于传入消息的实例FindRequestContext并调用OnBeginFind虚拟方法。 Resolve收到消息后,DiscoveryService调用OnBeginResolve虚拟方法。 可以从此类继承以提供自定义发现服务实现。

DiscoveryProxy

DiscoveryProxy抽象类提供用于接收和处理发现和公告消息的框架。 实现自定义发现代理时可以从此类继承。 Probe当通过多播接收消息时,DiscoveryProxy类会调用BeginShouldRedirectFind虚拟方法来确定是否应发送多播抑制消息。 如果开发人员决定不发送多播抑制消息,或者消息 Probe 通过单播接收,它将基于传入消息创建类的 FindRequestContext 实例并调用 OnBeginFind 虚拟方法。 Resolve当通过多播接收消息时,类DiscoveryProxy将调用ShouldRedirectResolve虚拟方法来确定是否应发送多播抑制消息。 如果开发人员决定不发送多播抑制消息,或者消息 Resolve 通过单播接收,它将基于传入消息创建类的 ResolveCriteria 实例并调用 OnBeginResolve 虚拟方法。 收到 Hello 或 Bye 消息时, DiscoveryProxy 调用引发公告事件的相应虚拟方法(OnBeginOnlineAnnouncementOnBeingOfflineAnnouncement)。

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,它是已发现的终结点的集合,以及一个字典EndpointDiscoveryMetadataDiscoveryMessageSequence

ResolveCriteria

ResolveCriteria 类是一个与版本无关的类,用于指定解析已知服务时使用的条件。 它包含已知服务的终结点地址。 开发人员可以通过指定 Duration 来提供解析操作的终止条件,该条件指定客户端等待响应的时间。

ResolveResponse

ResolveResponseResolve 操作的响应返回给 Resolve 方法的调用者。 它也存在于 ResolveCompletedEventArgs。 它包含EndpointDiscoveryMetadata的一个实例,代表发现的终结点,以及DiscoveryMessageSequence的一个实例。

ServiceDiscoveryBehavior

ServiceDiscoveryBehavior 类允许开发人员将发现功能添加到服务。 您可以将此行为添加到 ServiceHostServiceDiscoveryBehavior 类遍历服务主机中的应用程序终结点,并从可发现的终结点创建一个 EndpointDiscoveryMetadata 集合。 默认情况下,所有终结点都可以发现。 可以通过在特定终结点添加 EndpointDiscoveryBehavior 来控制该终结点的可发现性。 如果添加 ServiceDiscoveryBehavior 公告终结点,则在服务主机打开或关闭时,会通过每个公告终结点发送所有可发现终结点的公告。

UdpAnnouncementEndpoint

UdpAnnouncementEndpoint 类是一个标准公告终结点,预配置为通过 UDP 多播绑定进行公告。 默认情况下, UdpAnnouncementEndpoint 设置为使用 WSApril2005 WS_Discovery 版本。

UdpDiscoveryEndpoint

UdpDiscoveryEndpoint 类是一个标准发现终结点,预配置为通过 UDP 多播绑定进行发现。 默认情况下, DiscoveryEndpoint 设置为使用 WSDiscovery11 WS-Discovery 版本和 ServiceDiscoveryMode.Adhoc 模式。