自定义通道调度程序

CustomChannelDispatcher 示例演示如何通过直接实现 ServiceHostBase 以自定义方式生成通道堆栈,以及如何在 Web 宿主环境中创建自定义通道调度程序。 通道调度程序与 IChannelListener 交互以接受通道并从通道堆栈中检索消息。 此示例还提供一个基本示例,用于演示如何使用 VirtualPathExtension 在 Web 宿主环境中生成通道堆栈。

自定义 ServiceHostBase

此示例实现基本类型 ServiceHostBase 而不是 ServiceHost,以演示如何使用通道堆栈顶部的自定义消息处理层替换 Windows Communication Foundation (WCF) 堆栈实现。 重写虚拟方法 InitializeRuntime 可生成通道侦听器和通道调度程序。

若要实现 Web 承载的服务,请从 VirtualPathExtension 集合获取服务扩展 Extensions 并将其添加到 BindingParameterCollection,以便传输层知道如何基于宿主环境设置(即,Internet 信息服务 (IIS)/Windows 进程激活服务 (WAS) 设置)来配置通道侦听器。

自定义通道调度程序

自定义通道调度程序可扩展 ChannelDispatcherBase 类型。 此类型实现通道层编程逻辑。 在此示例中,请求-答复消息交换模式仅支持 IReplyChannel,但自定义通道调度程序可轻松扩展为其他通道类型。

调度程序首先打开通道侦听器,然后接受单一答复通道。 通过该通道,调度程序开始在一个无限循环中发送消息(请求)。 对于每个请求,它都会创建一条答复消息,并将其发送回客户端。

创建响应消息

消息处理是在 MyServiceManager 类型中实现的。 在 HandleRequest 方法中,将首先检查消息的 Action 标头以查看是否支持该请求。 定义了预定义的 SOAP 操作 http://tempuri.org/HelloWorld/Hello 以提供消息筛选功能。 这类似于 ServiceHost 的 WCF 实现中的服务协定概念。

对于正确的 SOAP 操作情况,此示例将检索请求的消息数据,并生成一个与该请求对应的响应,类似于在 ServiceHost 示例中所看到的内容。

在此示例中,通过返回自定义 HTML 消息对 HTTP-GET 谓词进行了特殊处理,以便您可以通过浏览器来浏览服务,查看是否已正确编译该服务。 如果 SOAP 操作不匹配,则发送回一条错误消息,指示不支持该请求。

此示例的客户端是一个常规 WCF 客户端,它不会假定服务中的任何内容。 这样,该服务专门设计为与你从常规 WCFServiceHost 实现获取的内容进行匹配。 因此,在客户端上仅需要一个服务协定。

使用示例

运行客户端应用程序将直接生成以下输出。

Client is talking to a request/reply WCF service.
Type what you want to say to the server: Howdy
Server replied: You said: Howdy. Message id: 1
Server replied: You said: Howdy. Message id: 2
Server replied: You said: Howdy. Message id: 3
Server replied: You said: Howdy. Message id: 4
Server replied: You said: Howdy. Message id: 5

还可以通过浏览器来浏览该服务,以便在服务器上处理 HTTP-GET 消息。 这会让您获得一个格式合理的 HTML 文本。