绑定的基本概念:
通道模型具有极大的灵活性,可以在协议通道,编码器,传输通道等各个方面进行设置,每次都需要设置一个完整的通道栈是一个较为复杂的事情,从传输协议上看,有HTTP,TCP,UDP,P2P,IPC和MSMQ等多种方案,从编码器上,有二进制编码,MTOM等编码方法,在加上消息的安全策略,会话设置的组合会有很多。绑定是一个定制好的通道栈,包含协议通道,传输通道和编码器,从功能上看,一个绑定集成了通信模式,可靠性,安全性,事务传播和互操作性等设置,标准绑定一共有十二种,
WCF 附带有以下绑定。
绑定 |
配置元素 |
说明 |
一个绑定,适用于与符合 WS-Basic Profile 的 Web 服务(例如基于 ASP.NET Web 服务 (ASMX) 的服务)进行的通信。此绑定使用 HTTP 作为传输协议,并使用文本/XML 作为默认的消息编码。 |
||
一个安全且可互操作的绑定,适合于非双工服务约定。 |
||
一个安全且可互操作的绑定,适用于双工服务协定或通过 SOAP 媒介进行的通信。 |
||
一个支持 WS-Federation 协议的安全的、可互操作的绑定,使联盟中的组织可以高效地对用户进行身份验证和授权。 |
||
一个安全且经过优化的绑定,适用于 WCF 应用程序之间跨计算机的通信。 |
||
一个安全、可靠且经过优化的绑定,适用于 WCF 应用程序之间计算机上的通信。 |
||
一个排队绑定,适用于 WCF 应用程序之间的跨计算机的通信。 |
||
一个支持多计算机安全通信的绑定。 |
||
一个适合于 WCF 应用程序和现有消息队列应用程序之间的跨计算机通信的绑定。 |
||
一个绑定,适用于与符合 WS-Basic Profile 且允许使用 HTTP Cookie 交换上下文的 Web 服务进行的通信。 |
||
一个安全且经过优化的绑定,适用于允许使用 SOAP 标头交换上下文的 WCF 应用程序之间跨计算机的通信。 |
||
一个绑定,可用于为通过 HTTP 请求(而不是 SOAP 消息)公开的 WCF Web 服务配置终结点。 |
||
一个安全且可互操作的绑定,适用于允许使用 SOAP 标头交换上下文的非双工服务协定。 |
源文档 <http://msdn.microsoft.com/zh-cn/library/ms730879(v=VS.90).aspx>
绑定 |
互操作性 |
安全性(默认) |
会话 (默认) |
事务 |
双工 |
编码(默认) |
流 (默认) |
BasicHttpBinding |
Basic Profile 1.1 |
(无)、传输、消息、混合 |
(无) |
(无) |
n/a |
文本、(MTOM) |
是 (缓冲式) |
WSHttpBinding |
WS |
传输、(消息)、混合 |
(无)、可靠会话、安全会话 |
(无)、是 |
n/a |
(文本)、MTOM |
否 |
WSDualHttpBinding |
WS |
(消息)、无 |
(可靠会话)、安全会话 |
(无)、是 |
是 |
(文本)、MTOM |
否 |
WSFederationHttpBinding |
WS-Federation |
(消息)、混合、无 |
(无)、可靠会话、安全会话 |
(无)、是 |
否 |
(文本)、MTOM |
否 |
NetTcpBinding |
.NET |
(传输)、消息、无、混合 |
(传输)、可靠会话、安全会话 |
(无)、是 |
是 |
二进制 |
是 (缓冲式) |
NetNamedPipeBinding |
.NET |
(传输)、无 |
无、(传输) |
(无)、是 |
是 |
二进制 |
是 (缓冲式) |
NetMsmqBinding |
.NET |
消息、(传输)、无 |
(无)、传输 |
无、(是) |
否 |
二进制 |
否 |
NetPeerTcpBinding |
对等 |
(传输) |
(无) |
(无) |
是 |
|
否 |
MsmqIntegrationBinding |
MSMQ |
(传输) |
(无) |
无、(是) |
n/a |
n/a |
否 |
BasicHttpContextBinding |
基本配置文件 1.1 |
(无)、传输、消息、混合 |
(无) |
(无) |
n/a |
文本、(MTOM) |
是 (缓冲式) |
NetTcpContextBinding |
.NET |
(传输)、消息、无、混合 |
(传输)、可靠会话、安全会话 |
(无)、是 |
是 |
二进制 |
是 (缓冲式) |
WSHttpContextBinding |
WS |
传输、(消息)、混合 |
(无)、可靠会话、安全会话 |
(无)、是 |
n/a |
文本、(MTOM) |
否 |
性能上考虑:
使用IPC的绑定性能要优于使用TCP的绑定,使用TCP 的绑定要由于HTTP。
WCF-WCF的交互可以分为下列几种情况1)跨越主机进程交互,2)快越应用程序但在统一进程内交互,3)在统一应用程序域内交互。
IPC基本概念
IPC是一种通信方法,而非通信协议。全称是进程间通信,在WIN32系统中,主要利用以下几种方法实现:
1.使用剪贴板,剪贴板可以在进程之间共享,并且这种机制容易理解,使用也方便,缺点是使用非常频繁,容易产生资源争用,同时性能不高。
2. 使用匿名管道和命名管道,管道是进程用来通信的共享内存区域,一个进程相管道重写入信息,而其他的进程可以从管道中读出信息,管道是进程之间交流的通道,管道的类型有两种, 匿名管道和命名管道,匿名管道是不命名的,他最初用于在本地系统中父进程与他启动的子进程之间的通信,命名管道更高级,它有一个名字表示,以示客户段和服务端应用程序可以通过它进行彼此通信,而且,WIN32 管道甚至可以在不同系统进程间使用。软件是连接两个进程并传输数据,一个管道一旦被建立,她就可以向文件一样被访问,并且可以使用许多与文件操作同样的函数,可以使用CreateFile函数获取一个以打开的管道句柄,或者由另一个进程提供一个句柄,使用WriteFile函数向管道写入数据,之后这些数据可以被另外进程使用ReadFile函数读取,管道是系统对象,因此管道句柄不需要时必须使用CloseHandler函数关闭,
3.匿名管道只能单向传送数据,而命名管道可以实现双向传送数据,管道可以比特流形式传送数据,命名管道可以将数据机和到成为消息的数据块中,命名管道甚至具有通过网络连接多个进程的能力。
4.使用邮件槽,广播式通信,在Win32系统中提供的新方法,可以在不同的主机间交换数据,实现了网络跨越.
5.使用TCP/IP他具备消息管道的所有功能,但遵守一套通信标准是的不同操作系统之上的应用程序可以互相通信,这种方式用于网络方面比较好,用于本地进程间交互性能较差。
6. 使用COM/DCOM:通过COM系统代理存根方式进行进程间数据交换,但只能够表现在对接口含糊调用时传递数据,通过DCOM可以在不同的主机间传送数据。
7.使用内存影射文件:系统内核内存区域开辟一块内存,然后每个进程把每个内存映射到自己可以访问的虚内存地址中,对每个进程说,似乎在操作系统的格子的内存区域,而实际上所有的操作被映射到内存区域中
跨主机的WCF-WCF交互的绑定的地址
当服务器部署在不同的服务器上,对于局域网内跨主机的WCF-WCF交互,采用TCP协议进行通信是较为合适的选择,首先TCP是先面连接的通信协议,其次处于传输层,TCP一般被称为是一种端对端的协议,当一台计算机需要与另一台计算机建立连接时,TCP协议会让他们建立一个连接,发送和接收资料以及终止连接,传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使他能够自动适应网上的各种变化。IP协议之保证计算机能够发送和接收分组资料,而TCP协议则可以提供一个可靠的,可流控制的,全双工的信息传输服务。
TCP/IP 通过一个应用程序协议分配一个唯一的16位断口号,从而使用断口号来区分应用程序,例如HTTP通信现在已经统一为使用TCP端口80 ,SMTP使用TCP端口25,FTP 使用TCP端口20和21 ,其他使用TCP传输协议的应用程序可以按习惯活遵循标准选择其他可用的断口号,防火墙一般会配置阻塞TCP通信,部署使用非标准端口的应用程序进程会因为存在公司防火墙和个人防火墙而变得复杂甚至无法实现,通过已得到允许标准的端口进行通信的应用程序可以较少外部攻击,TCP默认端口为80 ,在HTTP。SYS模型中,许多不同的HTTP应用程序的通信中将多路复用到单个TCP端口,此模型以及称为Window平台上的标准,这可以降低部署程序的成本。但是多个HTTP应用程序共享端口的能力早已成为Internet信息服务的一个功能,但是,只有在引入IIS6.0附带的协议之后,此基础结构才完全得到广泛使用,实际上,Http.Sys允许任意进程共享专用于HTTP通信的TCP端口,此功能可以让HTTP应用程序在统一物理计算机上共存于不同的进程中,同时共享80端口发送和接收所需要的网络基础结构。
使用netTcpBinding 是唯一能够使用TCP协议的使用二进制编码来提高性能
WebService是一种网络服务,通过通用的规范,WebService技术须臾使用者访问网络上每一个WebService提供的服务.Web服务的消息都是基于Soap协议进行的, 而Soap本身又处于Http/Https协议之上,所以Soap协议可以轻松地穿越防火墙,而同时借助XML的跨平台特性, Soap协议和具体的实现平台完全无关,Soap协议是简单对象访问协议的缩写,它致以与提供一个简单,轻量的用于在分散或分布环境中交换结构化和类型信息的机制,它致规范对消访问的方式,而不限制具体实现的技术环境,这意味着Soap协议是一种跨技术平台的协议,它一般由四部分组成:Soap信封,Soap编码规则,Soap RPc,Soap 绑定。
服务端绑定:
自定义绑定:
WCF中内置的几种协议绑定元素,其中包括:
ReliableSessionBindingElement:该绑定元素会在堆栈中提供一个可选层,该可选层可在终结点之间建立可靠会话并配置此会话的行为。所谓的可靠性,是指SOAP消息可以在不可靠的网络上(如HTTP)进行可靠的传递,保证消息无重复的、消息次序正确的进行交换,它的原理是:为一组消息设定相同的ID,根据消息号将消息编组,并根据顺序号进行排序,
SecurityBindingElement:该绑定元素为WCF中SOAP消息安全绑定元素的基类,它有三种具体的实现:支持对称加密通道安全的SymmetricSecurityBindingElement、支持不对称加密通道安全的AsymmetricSecurityBindingElement 和 支持混合模式通道安全的TransportSecurityBindingElement
TransactionFlowBindingElement:该绑定元素允许在终结点绑定设置中启用或禁用传入事务流,并允许指定传入事务所需的协议格式。
编码绑定元素
所谓的编码是将消息转换为一个字节序列的过程,而解码是相反的过程。编码绑定元素表示消息与准备用于网络传输的编码之间的转换,典型的WCF绑定正好包括一个编码绑定元素。WCF内置的编码绑定元素包括 MtomMessageEncodingBindingElement、BinaryMessageEncodingBindingElement 和 TextMessageEncodingBindingElement。 如果未对绑定指定编码绑定元素,则使用默认的编码。当传输协议是HTTP时,默认编码为文本,对于其他传输协议,默认编码为二进制。
TextMessageEncodingBindingElement:表示文本方式编码的XML消息编码器,它的优点是互操作性最强,缺点是效率最低。WCF服务或者客户端通常可以理解文本XML。但是,将大型二进制数据块作为文本传输不是有效的传输方式
BinaryMessageEncodingBindingElement:是指定在编码消息时应该使用二进制XML格式的绑定元素,它包含用于指定要使用何种字符编码以及SOAP消息与 WS-Addressing版本的选项。二进制编码的优点是效率最高,缺点是互操作性最低,
MtomMessageEncodingBindingElement:表示指定使用消息传输优化机制 (MTOM) 编码的消息所用的字符编码和消息版本管理以及其他设置的绑定元素。(MTOM) 是WCF消息中传输二进制数据的有效技术。MTOM 编码器会尝试在效率和互操作性之间建立平衡。MTOM 编码以文本形式传输大多数 XML,但通过按原样传输来优化大型二进制数据块的传输,无需将其转换为base64编码格式
传输绑定元素
这些元素表示传输协议上编码消息的传输。典型的WCF绑定正好包括一个从 TransportBindingElement 继承的传输绑定元素。WCF中内置的传输绑定元素有如下几种:
TcpTransportBindingElement
HttpTransportBindingElement
HttpsTransportBindingElement
NamedPipeTransportBindingElement
PeerTransportBindingElement
MsmqTransportBindingElement
MsmqIntegrationBindingElement
ConnectionOrientedTransportBindingElement
绑定元素顺序
在创建绑定时,向绑定中添加绑定元素的顺序非常重要,必须按照如下顺序进行:
1.最顶层是一个允许流事务的TransactionFlowBindingElement元素,可选;
2.接下来是一个可靠性支持的ReliableSessionBindingElement元素,可选;
3.接下来是一个安全性支持的SecurityBindingElement元素,可选;
4.在接下来是消息编码绑定元素,可以是系统内置的三种消息编码器之一或者自定义的消息编码器,必须具有,但是如果不添加,系统会根据传输不同默认添加一个消息编码器;
5.最底层是一个传输绑定元素,可以是系统内置的几种传输绑定元素之一或者自定义的传输绑定元素。
6.如果是自定义的绑定元素,根据绑定元素的功能可以放在以上几层任意层之间
代码:
// 可靠性支持
ReliableSessionBindingElement reliable =
new ReliableSessionBindingElement();
reliable.Ordered = false;
// 编码元素
TextMessageEncodingBindingElement text =
new TextMessageEncodingBindingElement();
text.MessageVersion = MessageVersion.Soap11WSAddressingAugust2004;
// 传输元素
HttpTransportBindingElement http = new HttpTransportBindingElement();
http.TransferMode = TransferMode.Streamed;
http.UseDefaultWebProxy = true;
// 自定义绑定
CustomBinding httpBinding = new CustomBinding();
httpBinding.Name = "httpBinding";
httpBinding.Elements.Add(reliable);
httpBinding.Elements.Add(text);
httpBinding.Elements.Add(http);
host.AddServiceEndpoint(typeof(ICalculator), httpBinding,
"http://localhost:8887/Calculator");
源文档 <http://www.cnblogs.com/Terrylee/archive/2008/11/06/WCF-Binding-Elements.html>