自定义通道调度程序

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

自定义 ServiceHostBase

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

若要实现 Web 托管服务,请从VirtualPathExtension集合中获取服务扩展并将其Extensions添加到该扩展BindingParameterCollection,以便传输层知道如何根据宿主环境设置(即 Internet Information Services(IIS)/Windows 进程激活服务(WAS)设置来配置通道侦听器。

自定义通道调度程序

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

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

创建响应消息

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

对于正确的 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 文本。