第七章:WCF入门
课后习题:
1.简要介绍WCF服务的承载方式及其特点。
WCF服务的承载方式包括:利用IIS或者WAS承载、利用Windows服务承载、自承载。其特点如下:
(1)用IIS或者WAS承载:这是最常用的一种承载方式,特点是部署简单,方便。
(2)用Windows服务承载:用【WCF服务库】模板创建的WCF服务利用Windows进程去承载。
(3)自承载:指开发人员自己编写代码实现承载WCF的工作。优点是实现灵活,需要的环境支持最小。缺点是高级宿主管理功能需要自己写代码实现。
2.什么是服务协定?什么是数据协定?分别用那些特性声明服务协定和数据协定?
服务协定是指WCF对客户端公开哪些服务。WCF服务端通过服务协定向客户端公开以下内容:操作方法、消息交换模式、采用的通信协议以及序列化格式。服务协定用ServiceContract特性和OperationContract特性来共同声明。
数据协定描述的是消息中包含哪些数据,即规定哪些数据能够被序列化为XML传输到客户端。数据协定用DataContract特性和DataMember特性来共同声明。
7.1预备知识
7.1.1XML
XML:可扩展性标记语言,是一套用文本定义语义标记的元标记语言
优点:与平台无关、可灵活的定义数据和结构信息、便于网络传递
XML特点:
(1)文本编码(不受所选用的操作系统,对象模型和编程语言的影响)
(2)XML中的所有标记都是自定义的
(3)XML规定所有标记都必须有开始标志和结束标志
XML的基本格式及其嵌套形式举例:
<root>
<name>张三</name>
<score>
<语文>90</语文>
<数学>95</数学>
</score>
</root>
7.1.2Web Service(Web服务)
根据数据交换格式的不同,Web Service进一步分为XML Web Service和JSON Web Service。
(一)XML Web Service
以XML作为数据交换格式、部署在Web服务器上的一种应用程序服务
(二)JSON Web Service(了解)
一般在Web应用程序通过HTML和JavaScript调用这种服务
1.Web服务的体系结构
Web服务的体系机构是基于服务提供者、服务请求者、服务注册中心3个角色,利用发布、发现、绑定3个操作来构建的。
Web服务涉及:
(1)SOAP(简单对象访问协议)
一种基于XML的、以HTTP作为基础传输协议的消息交换协议
定义了客户端与Web服务交换数据的格式,以及如何通过HTTP交换数据
*包含了4个主要部分:
①SOAP消息
②数据编码规则和统一木星
③RPC消息交换模式
④SOAP与HTTP之间的绑定
(2)Web服务描述语言(WSDL)
用于描述Web服务提供的方法以及调用这些方法的各种方式
WSDL可描述Web服务的3个基本属性:
①服务完成什么功能,指出Web服务提供了哪些方法
②如何访问服务,客户端和Web服务交互的数据格式以及必要的协议
③服务位于何处,与Web服务所用协议相关的地址
2.客户端与Web服务通信的过程
客户端调用服务提供的Web服务的过程:
阶段一:序列化
(1)客户端应用程序创建Web服务代理类的一个实例
(2)客户端应用程序调用代理类的方法
(3)客户端基础架构将Web服务所需要的参数序列化为SOAP消息,并通过网络将其发送给Web服务器
阶段二:反序列化
(4)Web服务器接收SOAP消息并反序列化该XML,同时创建实现Web服务的实例,再调用Web服务提供的方法,并将反序列化后的XML作为参数传递给该方法
(5)Web服务器执行Web服务提供的方法,得到返回值和各种输出参数
阶段三:序列化
(6)Web服务器将返回值和输出参数序列化为SOAP消息,并通过网络将其返回给客户端基础架构
阶段四:反序列化
(7)客户端基础架构接收返回的SOAP消息,将XML反序列化为返回值和输出参数,并将其传递给代理类的实例
(8)客户端应用程序接收返回值和输出参数
7.1.2Web Service
Web服务适用的场合:
提供不断更新的实时数据供其他应用程序使用
集成现有的各种应用程序
提供工作流解决方案
7.1.3远程处理(RPC)
为了解决不同计算机上的进程相互访问的一种具体实现
.NET远程处理模型生成一个应用程序,并让其中两个组件直接跨应用程序域边界进行通信,此时需要生成以下内容:
①一个可远程处理的对象
②一个宿主应用程序域,用于侦听针对该对象的请求
③一个客户端应用程序域,用于发出针对该对象的请求
7.1.4消息队列(MSMQ)
Message Queue是在多个不同的应用程序之间实现相互通信的一种基于队列和事务处理的异步传输模式
消息发送者把要发送的信息放入一个容器中(称为Message),然后把它保存在一个系统公用的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列汇总取出发给它的消息进行处理
MQ的两种发送方式:快速模式和可恢复模式
7.1.5面向服务的体系结构(SOA)
希望用一种统一的、以“服务”为中心的模型来整合各种不同的技术,而不是仅仅限于Web服务
7.2WCF入门
7.2.1WCF基础知识
WCF是微软公司推出的符合SOA思想的分布式应用程序技术框架和编程模型
WCF编程模型的目标是实现以下两个实体之间的通信:WCF服务和WCF客户端
该编程模型封装在.NET框架的System.ServiceModel命名空间下
1.WCF特点
以服务为中心
支持多种消息交换模式
支持多种传输协议和编码方式
支持工作流、事务以及持久性的消息处理
统一性、安全性和可扩展性
2.终结点
用于确定网络通信目标,用EndPoint类来实现,在配置文件中用endpoint标签配置节来指定
终结点由地址、协定和绑定组成,缺一不可:
①地址(Address):公开服务位置,即确定终结点的位置
②协定(Contract):公开提供的是哪种具体服务,表示客户端和服务端之间的信息交换规则
③绑定(Bingding):定义客户端和服务器端的通信方式
例:
<endpoint
address="http://localhost:2338/Service1.svc"
binding="basicHttpBinding"
contract="WcfService.IService1" />
(1)地址(Address)
WCF中的地址用于确定终结点的位置,地址可以是URL、FTP、网络路径或本地路径。
WCF规定的地址格式:
[传输协议]😕/[位置][:端口][/服务路径]
WCF服务可以在各种不同的基础网络协议(如TCP、UDP、HTTP等)之间传输
(2)绑定(binding)
WCF通过绑定来定义WCF客户端与WCF服务通信的方式
WCF提供了多种绑定方式(BasicHttpBinding、WSHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetMsmqBinding)
不论是服务端还是客户端,一般都是在单独的配置文件(Web.config、App.config)中配置绑定
(3)协定(Contract)
协定表示客户端和服务端之间的信息交换规则,如果不指定协定,就无法在客户端和服务端之间进行通信
协定在接口中用Contract特性声明,内部用ContractAttribute类来实现,在配置文件中用contract指定
7.2.2WCF体系结构
协定层、服务运行时层、消息传递层以及激活和承载层
7.2.3承载WCF的方式
WCF本身不能运行,只能将其宿主在某个可执行程序中(.dll或.exe)才能运行
1.利用IIS或WAS承载WCF服务
①IIS和IIS Express
IIS是微软推出的Web应用服务器
WCF应用程序开发完成后,将其部署在服务器操作系统的IIS中即可
②WAS(进程激活服务)
不需要将程序部署到IIS中,就可以承载并自动激活WCF服务,而且不需要开发人员编写任何承载代码(WCF服务应用程序采用该模式)
2.利用Windows服务承载WCF服务
Windows服务是Windows操作系统提供的功能,操作系统利用进程控制块来管理它
3.自承载方式
开发人员自己编写代码实现承载WCF的工作
非面向服务的企业级分布式解决方案
7.3WCF服务端和客户端编程基础
7.3.1WCF服务器端编程模型
编写WCF服务端程序的4个主要步骤:
选择承载方式
设计和实现协定
配置服务
承载服务
1.选择承载方式
编写HTTP应用程序时,一般选择【WCF服务应用程序】模板
注:WCF服务应用程序模板利用IIS自带的WAS承载和激活WCF服务
编写TCP应用程序时,既可以选择自承载方式,也可以选择【WCF服务应用程序】模板
编写UDP应用程序时,既可以用自承载方式,也可以用标准绑定
2.设计和实现协定
方法1:用一个接口公开多个方法,再用一个类实现接口中声明的所有方法(建议)
可以实现多继承、代码改动量小、版本升级简单
方法2:全部用类来实现,不使用接口
3.配置服务
方法1:通过修改配置文件(Web.config或者App.config)(推荐)
方法2:开发人员自己编写代码
4.承载服务
服务端设计完成后,运行服务即可,此时客户端就可以和服务端交互
7.3.2WCF客户端编程模型
编写WCF客户端应用程序时,可使用多种应用程序编程模型
编写WCF客户端程序的主要步骤如下:
1.利用服务端配置生成客户端代理类和客户端配置
运行WCF服务后,客户端可通过【添加服务引用】的办法,让系统自动生成客户端代理类,此时它会根据服务端配置自动修改客户端配置
2.编写客户端代码
客户端添加服务引用后,即可利用自动生成的客户端代理类,编写代码与WCF交互
3.更新客户端配置
如果服务端配置文件发生了改变,或者接口发生了改变,此时需要在客户端更新服务引用,以便让系统重新生成新的客户端配置
编写WCF程序的基本步骤如下:
创建服务端项目和客户端项目
- 编写服务端代码
- 修改服务端配置
- 测试服务(可选)
- 在客户端添加服务引用
- 编写客户端调用代码
- 更新服务引用(可选)
7.4设计和实现协定
7.4.1协定和特性
1.协定:
WCF在互相传递消息之前预先制定的数据交换规则,以便交换数据的双方能彼此理解对方发送的数据及其格式码
WCF中最常用的协定是服务协定和数据协定,通过特性声明
2.特性:
用来声明服务端定义的所有协定
用C#编写代码时,一律用中括号来声明特性类,声明时省略Attribute后缀
特性类的作用是为紧跟在它后面的目标元素提供设计行为,比如对某个字段声明了某个特性,则该特性的目标元素就是这个字段
例:
[ServiceContract]
public interface IService1{
[OperationContract]
double Add(double n1,double n2);
}
编译器编译这段代码时,遇到ServiceContract特性声明,它就会自动创建ServiceContractAttribute类的一个实例,并通过该实例处理IService1接口
7.4.2服务协定
服务协定:指WCF对客户端公开哪些服务
WCF服务端通过服务协定向客户端公开以下内容:
①操作方法
②消息交换模式
③采用的通信协议以及序列化格式
服务协定包括ServiceContract特性和OperationContract特性:
ServiceContract协定用于在应用程序中定义服务协定
OperationContract协定用于在应用程序中定义操作协定
1.ServiceContract特性常用属性
2.OperationContract特性常用属性
基本用法:
//在接口的前面用ServiceContract特性声明服务协定,在接口的内部用操作协定公开操作方法;在对应类中实现接口声明的方法:
[ServiceContract(NameSpace="WcfServiceExamples")]
public interface IService1{
[OperationContract] double Add(double n1,double n2);
[OperationContract] double Divide(double n1,double n2);
}
//WCF规定实现服务的接口中只能包含方法声明,不允许在接口中声明属性和字段,属性和字段是在实现接口中的类中通过数据协定来公开的
public class Service1:IService1{
public double Add(double d1,double d2){
return d1+d2;
}
public double Divide(double d1,double d2){
return d1/d2;
}
}
7.4.3数据协定
数据协定:数据协定是服务端与客户端之间交换数据的约定,即用某种抽象方式描述要交换的数据并将其传输到客户端
数据协定默认采用XML格式
数据协定利用DataContract特性和DataMember特性声明:
①DataContract特性定义哪些类可以被序列化
②DataMember特性用于声明类中的哪些成员可被序列化
基本用法:
①显式声明数据协定和成员协定:对于显式声明DataContract特性和DataMember特性的成员进行序列化
[DataContract]
public class MyData1{
//不论是private还是public,只要声明DataMember就可以序列化
public string MyName1=“me1”;//未声明DataMember,无法序列化
[DataMember]public string MyName2=“me2”;
[DataMember]public string myName3=“me3”;
[DataMember]public int Age{get;set;};
[DataMember]public List MyStudents{get;set;};
private string telephone=“null”;//无法序列化
[DataMember]
public string Telephone{
get{return telephone;}
set{telephone = value;}
}
}
②隐式声明数据协定和成员协定:WCF会自动对具有public修饰符的类、结构、枚举等应用数据协定,对具有public修饰符的字段和同时具有get和set的属性应用成员协定。
7.4.4消息协定
消息协定:在有些情况下,需要用单个类型来表示整个消息,使用消息协定可以避免在XML序列化时产生不必要的包装
7.5服务绑定与终结点配置
7.5.1在服务端配置文件中配置WCF服务
1.用【WCF服务应用程序】模板创建WCF服务项目
服务端配置信息保存在项目的Web.config文件中
客户端应用程序中的配置信息保存在项目的App.config文件中
2.对于终结点配置来说,通过配置文件(Web.config、App.config)配置终结点是推荐的做法
3.修改配置的方式
(1)直接修改配置
Web.config中的服务绑定配置完成后,在客户端添加服务引用时,系统会自动修改App.config文件中对应的客户端绑定配置
(2)利用配置工具修改配置
7.5.2终结点绑定方式
在系统提供的绑定中,最基本的就是basicHttpBinding
除此之外,系统还提供的常用绑定方式还包括:wsHttpBinding、wsDualHttpBinding、netTcpBinding、udpBinding、netNamedPipeBinding、netMsmqBinding以及netPeerTcpBinding
必须始终确保选择具有安全性保障的绑定
basicHttpBinding默认未启用安全性,其他绑定默认都已启用了安全性
7.5.3需要绑定的元素及其含义
绑定指定终结点之间通话时所使用的通信机制
绑定元素有:协议通道绑定元素、传输通道绑定元素和消息编码绑定元素
WCF提供了两种类型的通道:协议通道和传输通道
1.协议通道绑定元素
用于确定绑定到哪种消息处理协议(WS-Security或者WS-Reliability)来确保消息的安全性和可靠性
①安全性(security)
指消息的安全处理方式,即如何保护传输通道使其满足安全要求
在bindings下的binding节中,可使用mode特性配置消息的安全性(security),可选值:
②可靠性(WS-Reliability)
WCF通过传输通道传输消息的过程中,确保消息到达目的地而不会丢失消息
③事务
某个通信过程要么全部完成,要么回滚到未通信前的初始状态
④双工(Duplex)
是否支持双工通信
⑤传输方式(TransferMode)
传入消息和传出消息时使用的数据流采用哪种机制:
流式、缓冲式
可设置传输方式:
2.传输通道绑定元素(绑定基础传输协议)
指定终结点发送消息时使用的基础传输协议
使用基础传输协议来传输消息,例如HTTP、TCP、UDP等
负责对消息进行编码和解码
3.消息编码绑定元素
指定对发送到终结点的消息使用的消息编码
4.关于大型数据的特殊安全考虑事项
WCF的所有绑定都允许限制传入消息的大小,以拒绝服务攻击
例:
basicHttpBinding会公开一个MaxReceivedMesaageSize属性,限制传入消息的大小(默认为65536个字节),同时还限制在处理该消息时访问的最大内存量