Programming WCF Services学习笔记一、WCF本质
再有,我只是按照阅读顺序,把我认为有必要记录下来的内容按序号做笔记,所以大家可以把它当提纲来看。:-)
1. 什么是WCF?
i. WCF可以把CLR代码公布为Service,也可以消费其他类型的Service。
ii. WCF提供了Service之间的交互。
2. Service
i. Service是提供给外部使用的一个功能单元,是SQA的基本组成部分。
ii. 在WCF中,所有的消息都是平台中立的。
iii. 因为WCF的Service对外界是不透明的,所以WCF Service需要对外暴露元数据来描述所提供的功能和与Service通讯的方式。
iv. 元数据用一种预定义的、技术中立的方式(如WSDL/Http )发布,或者用一种元数据交换的工业标准发布。
v. 非WCF客户端可以导入元数据为本地的类型。
vi. WCF客户端可以导入元数据为CLR类型。
vii. WCF客户端从不直接和Service交互(即使是在本机,内存中调用),而是通过代理(Proxy),代理暴露和Service一样的接口和一些管理方法。
viii. WCF对远程和本地调用使用一套编程模型,使得可以在客户端更改Service的位置,而不影响调用。
3. Addresses
i. WCF的Address由两部分组成:地址和传输协议。
ii. WCF支持一下几种协议:HTTP,TCP,Peer Network,IPC,MSMQ。
4. Contracts
i. 在WCF中,Service被表现为Contracts。Contract是一种平台中立,标准的描述Service功能的约定。WCF定义了四种Contracts:
Service Contract---描述Service对外暴露的操作
Data Contract---定义Service传递的数据类型
Fault Contract---定义Service引发的错误,如何处理和传递错误到客户端
Message Contract---允许Service使用Message进行交互
ii. 实现一个ServiceContract时,不要使用带参数的Constructor,因为WCF总是使用默认的Constructor。同样,Internal Properties,Indexers和Stactic Member都不能用
iii. 不要把ServiceContact Attribute 用在Service的实现类上,要用在Interface上
iv. ServiceContract Attribute可以使用Name属性指定Service的NameSpace
v. OperationContract Attribute可以使用Name属性指定客户Operation的名字
5. Hosting
i. WCF Service不能独立存在,必须运行在宿主(Host)中。宿主可以是任意的Windows 进程。单个进程中可以Host多个Service,同一个Service也可以Host在多个进场中
ii. 使用IIS作为WCF Service 的Host的主要优势在于:Host 进程会在第一个调用到来时被自动启动,并且可以依赖IIS管理Host进程的生命周期。主要劣势在于:只能使用HTTP协议
iii. 开发者可以使用自宿主(Self-Hosting)自己管理Host 进程的生命周期,需注意的是必须在客户端调用之前启动宿主进程
iv. 使用自宿主:创建ServiceHost对象,并把Service的类型传给构造函数,之后调用Open方法即可
v. WAS Hosting是使用Windows Activation Service作为WCF的宿主。WAS是IIS7的一个组件。WAS Hosting的好处就是,可以使用所有的WCF的传输协议
6. Binding
i. Binding对照表
Table 1-1. Transport and encoding for standard bindings (default encoding is in bold) |
|||
Name |
Transport |
Encoding |
Interoperable |
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 |
ii. 选择Binding
7. EndPoint
i. EndPoint是Address,Binding,Contract的发布单元
ii. EndPoint可以使用配置文件,也可以使用编程方式发布
8. 元数据交换
i. Service有两个方式发布元数据。
1. 通过HTTP-GET协议---使用ServiceBehaviors中指定Service Metadata 的httpGetEnabled = true使得客户端可以自动通过HTTP-GET获得元数据
2. 通过指定的EndPoint---使用MEX EndPoint发布元数据
9. 客户端编程
i. 如果一个Service包含多个Contract的话,客户端需要为每一个Contract生产一个Proxy
ii. 可以使用在Visual Studio中Add Web Refrence或者使用SvcUtil命令生成代理
iii. 可以使用SvcConfigEditor.exe编辑WCF配置文件
iv. ClientBase<T>类是Proxy的基类,它接受一个Contract Type作为泛型参数
v. ClientBase实现了IDisposable接口,可以使用Using{}语句
vi. Call Timeout是Binding的一个属性,制定调用Service的超时时间,超过超时时间Client会得到TimeoutExeception异常
10. WCF Architecture
i. WCF Architecture
ii. Host Architecture
11. 可靠消息传递
i. WCF提供两个层面的可靠消息传递保障:
1. 通道层---提供点对点的网络包传递的保障,并保障包被传递的顺序
2. 消息层---提供对连接,阻塞,消息缓冲,控制流的保障
ii. 消息可靠传输与绑定
Table 1-2. Reliability and binding |
||||
Name |
Supports reliability |
Default reliability |
Supports ordered |
Default ordered |
BasicHttpBinding |
No |
N/A |
No |
N/A |
NetTcpBinding |
Yes |
Off |
Yes |
On |
NetPeerTcpBinding |
No |
N/A |
No |
N/A |
NetNamedPipeBinding |
No |
N/A (On) |
Yes |
N/A (On) |
WSHttpBinding |
Yes |
Off |
Yes |
On |
WSFederationHttpBinding |
Yes |
Off |
Yes |
On |
WSDualHttpBinding |
Yes |
On |
Yes |
On |
NetMsmqBinding |
No |
N/A |
No |
N/A |
MsmqIntegrationBinding |
No |
N/A |
No |
N/A |
iii. 消息传输顺序
1. 启用可靠消息传输时,自动启用传输顺序
iv. 启用可靠消息传递
1. 使用BindingConfiguration中的ReliableSession enable = true即开启
2. 可以使用DeliveryRequirements Attribute的RequireOrderedDelivery = true启用消息传递顺
(未完待续)