WCF 绑定的选择
选自《WCF服务编程中文版》 第一章 WCF基础
绑定
服务之间的通信方式是多种多样的,有多种可能的通信模式。包括:同步的请求/ 应答
(Request/Reply)消息,或者异步的“即发即弃(Fire-and-Forget)”消息;双向
(Bidirectional)消息;即时消息或队列消息;以及持久(Durable)队列或者可变
(Volatile)队列。传递消息的传输协议包括:HTTP(或HTTPS)、TCP、P2P(对等网)、
IPC(命名管道)以及MSMQ。消息编码格式包括:保证互操作性的纯文本编码格式;
优化性能的二进制编码格式;提供有效负载的MTOM(消息传输优化机制,Message
Transport Optimization Mechanism)编码格式。消息的安全保障也有多种策略,包括:
不实施任何安全策略;只提供传输层的安全策略;消息层的隐私保护与安全策略。当然,
WCF 还包括多种对客户端认证与授权的安全策略。消息传递(Message Delivery)可能
是不可靠的,也可能是可靠的端对端跨越中间方,然后断开连接的方式。消息传递可能
按照发送消息的顺序处理,也可能按照接收消息的顺序处理。服务可能需要与其他服务
或客户端交互,这些服务或客户端或者只支持基本的Web服务协议,或者使用了流行的
WS-* 协议,例如WS-Security 或者WS-Atomic Transaction。服务可能会基于原来的
MSMQ 消息与旧的客户端(Legacy Client)交互,或者限制服务只能与其他的WCF 服
务或客户端交互。
若要计算所有可能的通信模式与交互方式之间的组合,数量可能达到上千万。在这些组
合选项中,有的可能是互斥的,有的则彼此约束。显然,客户端与服务必须合理地组合
这些选项,才能保证通信的顺畅。对于大多数应用程序而言,管理如此程度的复杂度并
无业务价值。然而,一旦因此作出错误决定,就会影响系统的效率与质量,造成严重的
后果。
为了简化这些选项,使它们易于管理,WCF 引入了绑定(Binding)技术将这些通信特
征组合在一起。一个绑定封装了诸如传输协议、消息编码、通信模式、可靠性、安全性、
事务传播以及互操作性等相关选项的集合,使得它们保持一致。理想状态下,我们希望
将所有繁杂的基础功能模块从服务代码中解放出来,允许服务只需要关注业务逻辑的实
现。绑定使得开发者能够基于不同的基础功能模块使用相同的服务逻辑。
在使用WCF提供的绑定时,可以调整绑定的属性,也可以从零开始定制自己的绑定。服
务在元数据中发布绑定的选项,由于客户端使用的绑定必须与服务的绑定完全相同,因
此客户端能够查询绑定的类型与特定属性。单个服务能够支持各个地址上的多个绑定。
标准绑定
WCF 定义了9 种标准绑定:
基本绑定(Basic Binding)
由BasicHttpBinding类提供。基本绑定能够将WCF服务公开为旧的ASMX Web
服务,使得旧的客户端能够与新的服务协作。如果客户端使用了基本绑定,那么新
的WCF 客户端就能够与旧的ASMX 服务协作。
TCP 绑定
由NetTcpBinding 类提供。TCP 绑定使用TCP 协议实现在Intranet 中跨机器的通
信。TCP 绑定支持多种特性,包括可靠性、事务性、安全性以及WCF 之间通信的
优化。前提是,它要求客户端与服务都必须使用WCF。
对等网绑定
由NetPeerTcpBinding类提供。它使用对等网进行传输。对等网允许客户端与服
务订阅相同的网格(Grid ),实现广播消息。因为对等网需要网格拓扑(Grid
Topology)与网状计算策略(Mesh Computing Strategies)方面的知识,故而不
在本书讨论范围之内。
IPC 绑定
由NetNamedPipeBinding类提供。它使用命名管道为同一机器的通信进行传输。
这种绑定方式最安全,因为它不能接收来自机器外部的调用。IPC绑定支持的特性
与TCP 绑定相似。
Web 服务(WS)绑定
由WSHttpBinding类提供。WS绑定使用HTTP或HTTPS进行传输,为基于Internet
的通信提供了诸如可靠性、事务性与安全性等特性。
WS 联邦绑定(译注6)(Federated WS Binding)
由WSFederationHttpBinding类提供。WS联邦绑定是一种特殊的WS绑定,提
供对联邦安全(Federated Security)的支持。联邦安全不在本书讨论范围之内。
WS 双向绑定(Duplex WS Binding)
由WSDualHttpBinding 类提供。WS 双向绑定与WS 绑定相似,但它还支持从服
务到客户端的双向通信,相关内容在第5 章介绍。
译注6: WSFederationHttpBinding 支持WS-Federation 安全通信协议。WS-Federation 是WS 联
盟协议的一部分,定义了如何创建跨越多个安全区域的联邦会话,以便在经过单次身份
认证后即可使用部署在多个安全区域内的Web服务。它是一个联邦中多个实体相互信任
的安全机制。对于该安全机制,我们可以想象一下联邦国家中各个成员体之间的安全关
系。追本溯源,这也正是它命名为WS-Federation 的主要原因。
MSMQ绑定
由NetMsmqBinding 类提供。它使用MSMQ 进行传输,用以提供对断开的队列调
用的支持。相关内容在第9 章介绍。
MSMQ 集成绑定(MSMQ Integration Binding)
由MsmqIntegrationBinding 类提供。它实现了WCF 消息与MSMQ消息之间的
转换,用以支持与旧的MSMQ 客户端之间的互操作。MSMQ集成绑定不在本书讨
论范围之内。
格式与编码
每种标准绑定使用的传输协议与编码格式都不相同,如表1-1 所示。
表1-1:标准绑定的传输协议与编码格式(默认的编码格式为黑体)
名字传输协议编码格式互操作性
BasicHttpBinding HTTP/HTTPS Text, MTOM Yes
NetTcpBinding TCP Binary No
NetPeerTcpBinding P2P Binary No
NetNamedPipeBinding IPC Binary No
WSHttpBinding HTTP/HTTPS Text, MTOM Yes
WSFederationHttpBinding HTTP/HTTPS Text, MTOM Yes
WSDualHttpBinding HTTP Text, MTOM Yes
NetMsmqBinding MSMQ Binary No
MsmqIntegrationBinding MSMQ Binary Yes
文本编码格式允许WCF服务(或客户端)能够通过HTTP 协议与其他服务(或客户端)
通信,而不用考虑它使用的技术。二进制编码格式通过TCP 或IPC 协议通信,它所获得
的最佳性能是以牺牲互操作性为代价的,它只支持WCF 到WCF 的通信。
选择绑定
为服务选择绑定应该遵循图1-4 所示的决策活动图表。
首先需要确认服务是否需要与非WCF 的客户端交互。如果是,同时客户端又是旧的
MSMQ客户端,选择MsmqIntegrationBinding绑定就能够使得服务通过MSMQ与该
客户端实现互操作。如果服务需要与非WCF 客户端交互,并且该客户端期望调用基本
的Web 服务协议(ASMX Web 服务),那么选择BasicHttpBinding 绑定就能够模拟

图1-4:选择绑定
ASMX Web 服务(即WSI-Basic Profile)公开WCF 服务。缺点是我们无法使用大多数
最新的WS-*协议的优势。但是,如果非WCF客户端能够识别这些标准,就应该选择其
中一种WS 绑定,例如WSHttpBinding、WSFederationBinding 或者
WSDualHttpBinding。如果假定客户端为WCF客户端,同时需要支持脱机或断开状态
下的交互,则可以选择NetMsmqBinding 使用MSMQ 传输消息。如果客户端需要联机
通信,但是需要跨机器边界调用,则应该选择NetTcpBinding通过TCP 协议进行通信。
如果相同机器上的客户端同时又是服务,选择NetNamePipeBinding使用命名管道可以
使性能达到最优化。如果基于额外的标准,例如回调(选择WSDualHttpBinding)或
者联邦安全(选择WSFederationBinding),则应对选择的绑定进行微调。
注意: 即使超出了使用的目标场景,大多数绑定工作仍然良好。例如,我们可以使用TCP 绑定实
现相同机器甚至进程内的通信;我们也可以使用基本绑定实现Intranet 中WCF 对WCF 的
通信。然而,我们还是应尽量按照图1-4 选择绑定。
使用绑定
WCF 绑定的选择的更多相关文章
- WCF绑定类型选择
WCF绑定类型选择 发布日期:2010年12月10日星期五 作者:EricHu 在开发WCF程序时,如何选择一个适合的绑定对于消息传输的可靠性,传输模式是否跨进程.主机.网络,传输模式的支持. ...
- WCF绑定netTcpBinding寄宿到IIS
继续沿用上一篇随笔中WCF服务类库 Wettery.WcfContract.Services WCF绑定netTcpBinding寄宿到控制台应用程序 服务端 添加WCF服务应用程序 Wettery. ...
- WCF绑定和行为在普通应用和SilverLight应用一些对比
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 阅读目录 介绍 绑定 普通应用和SilverLight应用区别 本文版权归mephisto和博客园共有, ...
- WCF 绑定(Binding)
绑定包含多个绑定元素 ,它 们描述了所有绑定要求 .可以创建自定义绑定 ,也可以使用下表中的其中一个预定义绑定 : 不同的绑定支持不同的功能.以Ws开头的绑定独立于平台 ,支持 Web服务规范. 以 ...
- WCF - 绑定
从整个基础架构来看 WCF可分为服务模型层和信道层 模型层提供了一个统一的可扩展的编程模型 而信道层提供了对请求信息的接收和处理 而作为WCF通信的三要素之一的绑定 是它实现了组成整个信道层的信道栈 ...
- WCF - 绑定后续之自定义绑定
自定义信道基类 WCF是一个极具扩展性的通信框架 无论在服务模型层还是信道层 都具有很多扩展点 而信道层的扩展点主要体现在实现自定义信道以增强信道栈处理信息的能力 比如我们可以扩展信道层 实现一个自定 ...
- @Html.DropDownListFor 下拉框绑定(选择默认值)
首先先构建绑定下拉框的数据源 private void GetSalesList() { var userList = _rmaExpressAppService.GetUserList(); Tem ...
- WCF绑定netTcpBinding寄宿到控制台应用程序
契约 新建一个WCF服务类库项目,在其中添加两个WCF服务:GameService,PlayerService 代码如下: [ServiceContract] public interface IGa ...
- xml文件绑定chenckbox选择框
//xml文件如下: <?xml version="1.0" encoding="utf-8" ?> <CallReson> <! ...
随机推荐
- MTKLogger日志记录打开
MTKLogger在 拨号界面用*#446633#(不同手机可能设置不一样) 向左滑动到Log and Debugging下面有个MTKLogger,点进去 点击右上角进入设置,打开MobileLog ...
- markdown编辑
有用的技巧之,如何实现首行空两格,把输入法切换成全角(shift+space),就可以实现一个两字符的空格了. 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 w s r s r s 文本 ...
- Objective-C中一个方法如何传递多个参数的理解
原来如此 Objective-C语法中多参数传递方法经常是初学者最容易犯困的地方.我自己也是刚刚悟出来与大家分享. 分析 由于我们已有的语言经验告诉我们定义方法都是: 一个类型匹配一个参数(动态语言甚 ...
- 为EditText设置OnTouchListener事件监听
在项目中需要在EditText输入前,判断某个值是否已经有值,有才可以输入,为NULL值则提示不让输入,先填写指定的编辑框 自己试过监听获取焦点事件,来设置setFocusable(true)或者se ...
- SignalR 2.0入门
下载已完成的项目 本教程展示如何使用那么 SignalR 创建一个实时聊天应用程序.你会那么 SignalR 添加一个空的 ASP.NET web 应用程序,创建一个 HTML 页面发送并显示消息. ...
- PullToRefreshListView手动刷新问题
1.第一次进入界面刷新无效,需要延时刷新 new Handler().postDelayed(new Runnable() { @Override public void run() { // TOD ...
- Cocos移植到Android-通过命令行交叉编译打包
当我们在Windows下使用Visual Studio开发好Win32平台的游戏程序后,我们需要把它们移植到不同的平台上.Cocos2d-x支持很多个平台,然而,我们不可能介绍全部平台的移植.我们总结 ...
- 博客迁到CSDN
之前一直是博客园和CSDN博客同步更新 现在不在博客园继续写博客,十一国庆节假后只用CSDN博客了.祝各位访客国庆节快乐! CSDN博客地址: http://blog.csdn.net/it_liuc ...
- (POJ 1797) Heavy Transportation 最大生成树
题目链接:http://poj.org/problem?id=1797 Description Background Hugo Heavy is happy. After the breakdown ...
- 随机森林之Bagging法
摘要:在随机森林介绍中提到了Bagging方法,这里就具体的学习下bagging方法. Bagging方法是一个统计重采样的技术,它的基础是Bootstrap.基本思想是:利用Bootstrap方法重 ...