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 文本。