WCF介绍
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台,本质是一套软件开发包,与平台无关,即可以实现跨平台服务,是Windows平台上开发分布式应用最佳的实践方式。简单的归结为四大部分:
1、网络服务的协议,即用什么网络协议开放客户端接入。
2、业务服务的协议,即声明服务提供哪些业务。
3、数据类型声明,即对客户端与服务器端通信的数据部分进行一致化。
4、传输安全性相关的定义。
WCF学习
服务三要素
这里我们主要学习WCF的三个服务要素:契约、绑定和地址。
契约
契约的本质就是用来定义服务的。从SOA系统来看,属于服务公开接口的一部分。一个服务契约,定义了服务端公开的服务方法,使用传输协议,可访问地址,传输的消息格式等内容。即契约描述了该服务的功能和作用,告诉SOA系统中的其他节点这个服务是干什么的。
服务契约
以ServiceContract标识,一般设置为接口,但也可以是类。ServiceContract用来标识需要加入服务的内容(类或结构),代表其被远程调用。OperationContract用来标识需要实现的操作(类中方法),代表其能被远程调用。
数据契约
DataContract和DataMember.DataContract 指类或结构能够被序列化并传输。DataMember 只能用在类或者结构的属性或字段上,指该属性或字段能够被序列化传输。DataContractAttribute和DataMemberAttribute标注自定义数据类型,便可传递复杂数据体(需先添加System.Runtime.Serialization.dll引用)
消息契约
MessageContract 对控制消息头和消息体元素提供了强力支持,支持MessageHeaderAttribute和MessageBodyMemberAttribute属性,可以添加自定义头,控制消息是否被包装(IsWrapped),以及控制签名与加密(ProtectionLevel)。
错误契约
用于自定义错误异常的处理方式。默认情况下,当服务器抛出异常的时候,客户端能接收到异常信息的描述,但这些描述往往格式统一,有时比较难以从中获取有用的信息。我们可以自定义异常消息的格式,将我们关心的消息放在错误消息中传递给客户端,此时需要在方法上添加自定义一个错误消息的类,然后在要处理异常的函数上加上FaultContract,并将异常信息指示返回为自定义格式。
注意
重载问题 在重载是面向对象重要思想,体现了多态特性。但是在WCF中,同一个服务协定中,不能存在同名的方法OperationContract,所以在需要重载时,需要给定重载方法一个OperationContract名称,才能实现调用。
[OperationContract(Name ="HelloString")]//在同一个协定(serviceContract中不能存在同名的方法,但是可以给OperationContract定义名称,以此来区分这是不同的方法
//默认 请求响应模式
string Hello(string name);
[OperationContract(IsOneWay =true, Name = "HelloVoid")] //定义的是OneWay单程模式,如果没有则是默认的请求响应模式,oneway只有响应,没有返回值
void Hello();
请求-响应操作 在默认情况下,服务契约中一般都属于请求-响应操作,是一种交互方式。
单程操作 One-Way操作不需要服务给出响应,即客户端发出消息,并且得到服务端确认后,就理解结束本次操作调用的模式。
双程操作 当服务端主动发送消息给客户端时,当客户端需要发送批量信息而只需要一个回复时,这时候就需要双程操作。定义回调契约:CallbackContract=typeof(ICallbackService)。需要注意的是,回调契约容易引发死锁的情况。
//回调契约
[ServiceContract(CallbackContract = typeof(ICallbackService))]
public interface ICallbackService
{
[OperationContract]
void Hello();
}
绑定
Binding,是一个制定好的通道栈,包含协议通道,传输通道和编码器。从功能上看,一个绑定继承了通信模式、可靠性、安全性、事务传播和互操作性等设置。下面是WCF提供的12中标准绑定的介绍:
那么我们该如何选择呢,下面有一个流程图,可供我们参考依据:
下面简要介绍几种绑定:
netNamePipeBinding
属于本机WCF-WCF交互的绑定和地址,IPC实现方式。但是netNamePipeBinding绑定只能使用与本机交互,即服务和客户端都需要部署在同一台主机上才能使用,由于是在同一台主机交互,所以netNamePipeBinding是标准绑定中性能最佳的绑定。
终节点设置:命令管道协议://主机名:端口/服务地址(可选项) net.pipe://[Hostname]:[port]/[ServiceAddress]
总结
支持单程传输模式
支持“请求-响应”传输模式
支持双工传输模式
性能在标准绑定中最佳
支持WS(Web Service)事务协议
支持传输层消息安全
仅限于WCF系统
不支持跨主机交互
netTcpBinding
跨主机WCF-WCF交互的绑定和地址。在大型SOA系统中,多个服务器部署在局域网内不同的主机上,不再使用限定本机交互的IPC,一般采用TCP协议进行通信。
TCP协议:端对端协议,远程连接,连接、发送和接收资料以及终止连接,自动调整超时值,提供可靠、双工传输。
Net.Tcp端口共享:Net.TCP Port sharing service组件,使net.tcp端口可在多个用户进程间共享。net.tcp端口共享服务是用户模式的Windows服务,可代表通过其连接的辅助。
netTcpBinding绑定:WCF标准协议中,直接使用TCP协议进行消息交互的只有netTcpBinding,且使用二进制编码提高性能,也支持传输安全。可配置closeTimeout、hostNameComparisonMode、listenBacklog、maxBufferPoolSize、MaxConnections、Name、security、openTimeout等属性。
总结
支持单程传输模式
支持“请求-响应”传输模式
支持双工传输模式
性能在标准中,仅次于netNamePipeBinding
支持ws-事务协议
支持传输层消息安全
只限于WCF系统
支持跨主机交互
支持可靠会话传输
basicHttpBinding
基于基础的Web服务的标准绑定。
支持请求响应传输;
不支持双工传输;
性能一般;
不知处ws事务协议;
提供基本web服务交互;
可靠会话传输;
跨主机交互
扩展学习
WebService介绍
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。
WCF与WebService区别
WebService严格说来是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是跨语言和平台的关键)。WCF其实一定程度上就是ASP.Net Web Service,因为它支持Web Service的行业标准和核心协议,因此ASP.NET Web Service能做的事情,它几乎都能胜任。WCF不仅支持和继承Web Service,它还兼容和具备微软早期很多技术的特性。
SOA系统
Service Oriented Architecture,面向服务架构,属于组件架构模型。在W3C中,对其定义:一组公开发表接口,并且提供查询的组件。
特性
每个服务具有明确边界
服务是独立的
采用标准的契约定义和通信协议
服务是自解释的