《WCF技术内幕》翻译35:第2部分_第6章_通道:通道功能

  1. 云栖社区>
  2. 博客>
  3. 正文

《WCF技术内幕》翻译35:第2部分_第6章_通道:通道功能

技术小胖子 2017-11-14 18:31:00 浏览594
展开阅读全文
Chapter 6: Channels
6章:通道(Channel
通道功能
传输通道
协议通道
组合通道
 
通道功能
通道能够执行不同的任务。实际上,通道里可以定义任何消息功能,然后嵌入到WCF运行时里。我们可以大概地划分一下WCF通道执行任务的类型。概念上,通道可以方便使用特定的传输、协议或通道形状。
传输通道
传输通道是与网络、文件系统、内存或其他的程序(如Microsoft SQL Server 2005、SAP或Oracle)交互的通道。WCF至少有一个对应的通道来支持每一个传输。例如,WCF支持TCP/IP通信,而且WCF程序与sockets交互的工具就是TCP/IP通道。
TCP/IP、HTTP、Named Pipes和MSMQ成为主流传输方式的今天,应用系统或许还需要其他的传输方式。比如,文件系统、简单邮件传输协议(SMTP)、邮局协议3POP3)和文件传输协议(FTP)。这些都可以成为候选者。如果一个支持,那么其它的成为WCF支持的传输也很有可能。考虑一下SQL Server 2005 Service Broker。虽然它不是一个标准的传输,但是通过创建WCF传输通道就可以使得程序能够通过WCF的编程模型使用SQL Server 2005 Service Broker的功能。借助Service Broker自定义通道,程序就可以像调用WS-*一样,来调用Service Broker。作用上,自定义传输通道允许开发人员更多的关注与业务功能而不是Service Broker接口或API。这些自定义通道的概念也同样适用于其它的计算系统,如SAP和Oracle
在通道堆栈里,传输通道通常都位于最底层。从发送者的角度,在数据发送以前,传输通道是堆栈里最后一个通道。从接收者的角度,在数据接收以后,传输通道是第一个通道。作用上,堆栈里的其它通道不需要知道程序使用的传输协议。没有传输通道的通道堆栈没有任何价值(极端情况除外)所有的通道至少包含一个传输通道。你会在本章的“组合通道”部分看到有些通道可以包含多个传输通道。
协议通道
协议通道是WCF实现消息协议的主要方式,像WS-ReliableMessaging、 WS-AtomicTransaction和WS-SecureConversation。实际上,WCF是通过协议通道来支持WS-*规范的。因为WS-*规范里规定程序级别的消息交换可以在传输层产生多个消息。在通道堆栈里,WS-*协议通道经常产生消息,上层的通道不会理解这些消息。例如,考虑图6-3里的通道堆栈。
6-3:支持WS-ReliableMessaging协议的通道
当发送程序发送一个Message到通道堆栈,堆栈最终会对消息进行编码并通过网络发送出去。因为堆栈里包含WS-RM 通道,所以会有多个Message实例被编码和发送。WS-RM应答消息会停留在堆栈里直到它们都到达WS-RM通道。对于WS-RM应答消息,WS-RM通道会执行WS-RM规范定义的操作,并且不需要发送消息给上一层的通道。如果发送消息使用一个双向契约,WS-RM通道将会发送应答消息给上一层的通道。通常,堆栈里可以存在多个协议通道。在图6-3里,给出了4个协议通道。实际上堆栈里协议通道的工作方式和上图里WS-RM通道非常类似。
组合通道
组合通道允许通道在堆栈里修改通道形状。 这样,组合通道就创建了一种使用已有功能模块的新的方式。例如,MSMQ是发送单向消息的一种方式,而且WCF支持使用MSMQ。一个自定义的组合通道允许WCF程序使用MSMQ来进行双工通信。因为双工通信本质上就是可以同时发送和接收消息,一个MSMQ双工组合通道需要同时包装一个MSMQ接收通道和发送通道,如图6-4所示:
图6-4:一个组合通道
如图6-4所示,组合通道为了支持IDuplexChannel而包装了IInputChannel 和IOutputChannel。实际上,组合通道值得花费太多的时间去介绍,是因为它们拥有比较有趣的线程和同步机制。例如,考虑一下为了组合通道,通道状态机的转换问题。因为组合通道包装了其它通道,所有包装的通道必须使用组合通道来转换通道状态机。因为上一层通道可以调用组合通道之上的BeginOpen和 BeginClose方法,所以组合通道必须返回一个表示子通道里BeginOpen和 BeginClose方法返回结果的IAsyncResult对象。关于这个问题的详细信息,我推荐在http://wintellect.com/下载,然后阅读一下PowerThreading库部分,同样也可以看一下Jeffrey Richter的《CLR via C#》一书关于线程部分的描述。




 本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/318561,如需转载请自行联系原作者




网友评论

登录后评论
0/500
评论
技术小胖子
+ 关注