版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、工业和信息化部工业和信息化部“十二五十二五”规划教材规划教材普通高等学校普通高等学校“十二五十二五”规划教材规划教材C#网络应用编程网络应用编程第第3版版第第7章章 WCF入门入门2Ch7 WCF入门入门7.1 预备知识预备知识7.2 WCF入门入门7.3 WCF服务端和客户端编程基础服务端和客户端编程基础7.4 设计和实现协定设计和实现协定7.5 服务绑定与终结点配置服务绑定与终结点配置7.1 预备知识预备知识l7.1.1 XMLl7.1.2 Web Servicel7.1.3 远程处理(远程处理(RPC)l7.1.4 消息队列(消息队列(MSMQ)l7.1.5 面向服务的体系结构(面向服务
2、的体系结构(SOA)47.1.1 XMLlXML(Extensible Markup Language,可扩展的标记语言),可扩展的标记语言)是一套用文本来定义语义标记的元标记语言,具有与平台无关、是一套用文本来定义语义标记的元标记语言,具有与平台无关、可灵活的定义数据和结构信息、便于网络传递等优势。可灵活的定义数据和结构信息、便于网络传递等优势。lXML特点特点XML是文本编码,因此不受所选用的操作系统、对象模型是文本编码,因此不受所选用的操作系统、对象模型和编程语言的影响,可在任何网络中正常传输。和编程语言的影响,可在任何网络中正常传输。XML中的所有标记都是自定义的,通过这些自定义的标记
3、,中的所有标记都是自定义的,通过这些自定义的标记,可描述某种数据的不同部分及其嵌套的层次结构。可描述某种数据的不同部分及其嵌套的层次结构。XML规定所有标记都必须有开始和结束标志。规定所有标记都必须有开始和结束标志。57.1.2 Web ServicelWeb Service也叫也叫Web服务,根据数据交换格式的不同,服务,根据数据交换格式的不同,Web Service又进一步分为又进一步分为XML Web Service和和JSON Web Service等。等。XML Web Service是一种以是一种以XML作为数据交换格式。作为数据交换格式。以以JSON作为数据交换格式的作为数据交换
4、格式的Web服务称为服务称为JSON Web Service。67.1.2 Web ServicelWeb服务的体系结构基于服务提供者、服务请求者、服务注册服务的体系结构基于服务提供者、服务请求者、服务注册中心三个角色,利用发布、发现、绑定三个操作来构建的。中心三个角色,利用发布、发现、绑定三个操作来构建的。SOAP (Simple Object Access Protocol)SOAPSOAP是一种基于是一种基于XMLXML的,以的,以HTTPHTTP作为基础传输协议的消息交换协议。作为基础传输协议的消息交换协议。SOAPSOAP定定义了客户端与义了客户端与WebWeb服务交换数据的格式。服
5、务交换数据的格式。WSDL(Web Service Description Language)描述描述WebWeb服务提供的方法以及调用这些方法的各种方式。通过服务提供的方法以及调用这些方法的各种方式。通过WSDLWSDL,可描述,可描述WebWeb服务的服务的3 3个基本属性:个基本属性:1 1)服务完成什么功能。即指出)服务完成什么功能。即指出WebWeb服务提供了哪些方法。服务提供了哪些方法。2 2)如何访问服务。客户端和)如何访问服务。客户端和WebWeb服务交互的数据格式以及必要的协议。服务交互的数据格式以及必要的协议。3 3)服务位于何处。指出与)服务位于何处。指出与WebWeb服
6、务所用协议相关的地址,如服务所用协议相关的地址,如URLURL、UDDIUDDI(Universal DescriptionUniversal Description,Discovery, and IntegrationDiscovery, and Integration)等)等77.1.2 Web Servicel客户端与客户端与Web服务通信的过程服务通信的过程客户端调用服务端提供的客户端调用服务端提供的Web服务时,系统执行了一系列的操作,主要过程如下。服务时,系统执行了一系列的操作,主要过程如下。(1)客户端应用程序创建)客户端应用程序创建Web服务代理类的一个实例。服务代理类的一个实
7、例。(2)客户端应用程序调用代理类的方法。)客户端应用程序调用代理类的方法。(3)客户端基础架构将)客户端基础架构将Web服务所需要的参数序列化为服务所需要的参数序列化为SOAP消息,并通过网络将其发消息,并通过网络将其发送给送给Web服务器。服务器。(4)Web服务器接收服务器接收SOAP消息并反序列化该消息并反序列化该XML,同时创建实现,同时创建实现Web服务的实例,再服务的实例,再调用调用Web服务提供的方法,并将反序列化后的服务提供的方法,并将反序列化后的XML作为参数传递给该方法。作为参数传递给该方法。(5)Web服务器执行服务器执行Web服务提供的方法,得到返回值和各种输出参数。
8、服务提供的方法,得到返回值和各种输出参数。(6)Web服务器将返回值和输出参数序列化为服务器将返回值和输出参数序列化为SOAP消息,并通过网络将其返回给客户消息,并通过网络将其返回给客户端基础架构。端基础架构。(7)客户端基础架构接收返回的)客户端基础架构接收返回的SOAP消息,将消息,将XML反序列化为返回值和输出参数,并反序列化为返回值和输出参数,并将其传递给代理类的实例。将其传递给代理类的实例。(8)客户端应用程序接收返回值和输出参数。)客户端应用程序接收返回值和输出参数。87.1.2 Web Servicel客户端与客户端与Web服务通信的过程服务通信的过程97.1.2 Web Ser
9、vicelWeb服务适用的场合服务适用的场合提供不断更新的实时数据供其他应用程序使用。提供不断更新的实时数据供其他应用程序使用。集成现有的各种应用程序。集成现有的各种应用程序。提供工作流解决方案。提供工作流解决方案。107.1.3远程处理(远程处理(RPC)lRPC(Remote Procedure Call)远程过程调用。远程过程调用。远程处理技术是为了解决不同计算机上的进程相互访问的一远程处理技术是为了解决不同计算机上的进程相互访问的一种具体实现。种具体实现。.NET远程处理模型生成一个应用程序,并让远程处理模型生成一个应用程序,并让其中两个组件直接跨应用程序域边界进行通信。此时需要生其中
10、两个组件直接跨应用程序域边界进行通信。此时需要生成以下内容:成以下内容:u一个可远程处理的对象。一个可远程处理的对象。u一个宿主应用程序域,用于侦听针对该对象的请求。一个宿主应用程序域,用于侦听针对该对象的请求。u一个客户端应用程序域,用于发出针对该对象的请求。一个客户端应用程序域,用于发出针对该对象的请求。117.1.4 消息队列(消息队列(MSMQ)lMQ(Message Queue)是在多个不同的应用程序之间实现相)是在多个不同的应用程序之间实现相互通信的一种基于队列和事务处理的异步传输模式。互通信的一种基于队列和事务处理的异步传输模式。其实现原理是:消息发送者把要发送的信息放入一个容器
11、中其实现原理是:消息发送者把要发送的信息放入一个容器中(称为(称为Message),然后把它保存至一个系统公用的消息),然后把它保存至一个系统公用的消息队列(队列(Message Queue)中;本地或者是异地的消息接收)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。程序再从该队列中取出发给它的消息进行处理。MSMQ是微软实现的是微软实现的MQ。127.1.5面向服务的体系结构(面向服务的体系结构(SOA)lSOA(Service-Oriented Architecture,面向服务的体系结,面向服务的体系结构)。构)。其基本思想就是希望用一种统一的、以其基本思想就是希
12、望用一种统一的、以”服务服务“为中心的模为中心的模型来整合各种不同的技术,而不是仅仅限于型来整合各种不同的技术,而不是仅仅限于Web服务。服务。对于对于.NET开发人员来说,这个基于开发人员来说,这个基于SOA的具体实现就是的具体实现就是WCF。7.2 WCF入门入门l7.2.1 WCF基础知识基础知识l7.2.2 WCF体系结构体系结构l7.2.3 承载承载WCF的方式的方式147.2.1 WCF基础知识基础知识lWCF是微软公司推出的符合是微软公司推出的符合SOA思想的分布式应用程序技术思想的分布式应用程序技术框架和编程模型。框架和编程模型。lWCF编程模型的目标是实现以下两个实体之间的通
13、信:编程模型的目标是实现以下两个实体之间的通信:WCF服务和服务和WCF客户端。客户端。l该编程模型封装在该编程模型封装在.NET框架的框架的System.ServiceModel命名空命名空间中。间中。lWCF特点特点以服务为中心以服务为中心支持多种消息交换模式支持多种消息交换模式支持多种传输协议和编码方式支持多种传输协议和编码方式支持工作流、事务以及持久性的消息处理支持工作流、事务以及持久性的消息处理统一性、安全性和可扩展性统一性、安全性和可扩展性157.2.1 WCF基础知识基础知识l终结点(终结点(EndPoint)终结点(终结点(EndPoint)用于确定网络通信目标,用)用于确定网
14、络通信目标,用EndPoint类来实现,在配置文件中用类来实现,在配置文件中用配置节来指定。配置节来指定。对于对于WCF来说,终结点由地址、协定和绑定组成,三者缺来说,终结点由地址、协定和绑定组成,三者缺一不可。其中,地址(一不可。其中,地址(Address)用于公开服务的位置,协)用于公开服务的位置,协定(定(Contract)用于公开提供的是哪种具体服务。例如:)用于公开提供的是哪种具体服务。例如:endpoint contract=WcfService.IService1 /167.2.1 WCF基础知识基础知识地址(地址(Address)uWCFWCF中的地址用于确定终结点的位置。地址
15、可以是中的地址用于确定终结点的位置。地址可以是URLURL、FTPFTP、网络路、网络路径或本地路径。径或本地路径。WCFWCF规定的地址格式为:规定的地址格式为:u 传输协议传输协议:/:/位置位置:端口端口/服务路径服务路径 u例如:例如:http:/:50001/MyServicehttp:/:50001/MyServicehttp:/localhost:8733/Design_Time_Addresses/MyServicehttp:/localhost:8733/Design_Time_Addresses/MyServicehttp:/localhost:8080/MyService
16、http:/localhost:8080/MyServiceuWCFWCF服务可以在各种不同的基础网络协议(例如服务可以在各种不同的基础网络协议(例如TCPTCP、UDPUDP、HTTPHTTP等)等)之间传输。之间传输。u下面的代码演示了客户端通过下面的代码演示了客户端通过TCPTCP访问访问WCFWCF服务的地址格式:服务的地址格式:net.tcp:/localhost:50001/MyServicenet.tcp:/localhost:50001/MyService177.2.1 WCF基础知识基础知识绑定(绑定(Bingding)uWCFWCF通过绑定来定义通过绑定来定义WCFWCF客
17、户端与客户端与WCFWCF服务通信的方式。服务通信的方式。uWCFWCF提供了多种绑定方式(提供了多种绑定方式(BasicHttpBindingBasicHttpBinding、WSHttpBingdingWSHttpBingding、NetTcpBindingNetTcpBinding、NetNamedPipeBindingNetNamedPipeBinding、NetMsmqBindingNetMsmqBinding)。)。u不论是服务端还是客户端,一般都是在单独的配置文件(不论是服务端还是客户端,一般都是在单独的配置文件(Web.configWeb.config、App.configAp
18、p.config)中配置绑定。)中配置绑定。协定(协定(Contract)u协定表示客户端和服务端之间的信息交换规则,例如服务协定、数协定表示客户端和服务端之间的信息交换规则,例如服务协定、数据协定、消息协定等。如果不指定协定,就无法在客户端和服务端据协定、消息协定等。如果不指定协定,就无法在客户端和服务端之间进行通信。之间进行通信。u协定在接口中用协定在接口中用ContractContract特性来声明,内部用特性来声明,内部用ContractAttributeContractAttribute类类来实现,在配置文件中用来实现,在配置文件中用contractcontract指定。指定。187
19、.2.1 WCF基础知识基础知识l服务端和客户端服务端和客户端假设有假设有A、B、C、D四台计算机,四台计算机,A、B、C三台计算机安三台计算机安装的操作系统都是装的操作系统都是Windows 7,D计算机安装的操作系统为计算机安装的操作系统为Windows Sever 2008 R2。这四台计算机上分别部署以下。这四台计算机上分别部署以下应用程序,构成一个简单的分布式应用系统。应用程序,构成一个简单的分布式应用系统。u一个名为一个名为WcfAWcfA的的WCFWCF服务库,同时部署到服务库,同时部署到A A、B B两台计算机上,该服务两台计算机上,该服务库通过库通过WindowsWindow
20、s服务让其开机自启动服务让其开机自启动WCFWCF服务。服务。u一个名为一个名为WcfBWcfB的的WCFWCF服务应用程序,通过服务应用程序,通过IISIIS部署到部署到D D计算机上,该计计算机上,该计算机是一台算机是一台WebWeb服务器,也是开机自启动服务器,也是开机自启动WCFWCF服务。服务。u一个名为一个名为WpfAppWpfApp的的WPFWPF应用程序,这是一个客户端应用程序,用户可应用程序,这是一个客户端应用程序,用户可通过通过WebWeb服务器提供的下载链接网页,分别下载并安装到服务器提供的下载链接网页,分别下载并安装到A A、B B、C C三三台计算机上。台计算机上。1
21、97.2.1 WCF基础知识基础知识下面通过例子说明服务端、客户端和终结点之间的区别和联系下面通过例子说明服务端、客户端和终结点之间的区别和联系u(a a)当)当WcfAWcfA中的某个方法调用中的某个方法调用WcfBWcfB中的某个方法时,此时中的某个方法时,此时A A是客户是客户端,端,D D提供提供WCFWCF服务;反之,当服务;反之,当WcfBWcfB中的某个方法调用中的某个方法调用WcfAWcfA中的某个中的某个方法时,此时方法时,此时D D是客户端,是客户端,A A提供提供WCFWCF服务。服务。u(b b)当)当A A、B B、C C上的上的WpfAppWpfApp调用调用Wcf
22、AWcfA中的某个方法时,中的某个方法时,A A、B B、C C都是都是客户端,客户端,A A提供提供WCFWCF服务。服务。u(c c)A A、B B、C C、D D都是终结点。准确来说,是都是终结点。准确来说,是WcfAWcfA、WcfBWcfB这些进程(这些进程(或线程)执行的方法、通信对应的或线程)执行的方法、通信对应的IPIP地址、端口以及相关的协定共地址、端口以及相关的协定共同构成终结点。同构成终结点。207.2.2 WCF体系结构体系结构lWCF体系结构分为协定层、服务运行体系结构分为协定层、服务运行时层、消息传递层以及激活和承载层。时层、消息传递层以及激活和承载层。协定层协定层
23、u协定层用于在相互传递消息之前制定协定层用于在相互传递消息之前制定服务规则、数据交换规则、消息格式、服务规则、数据交换规则、消息格式、安全策略、绑定的网络协议,以及消安全策略、绑定的网络协议,以及消息采用的数据编码方式等息采用的数据编码方式等服务运行时层服务运行时层u处理在服务实际运行期间发生的行为处理在服务实际运行期间发生的行为消息传递层消息传递层u消息传递层描述数据的各种格式和交消息传递层描述数据的各种格式和交换模式换模式激活和承载层激活和承载层u负责激活或者承载负责激活或者承载WCFWCF服务服务217.2.3 承载承载WCF的方式的方式lWCF本身不能运行,只能将其本身不能运行,只能将
24、其“宿主宿主”在某个可执行程序中在某个可执行程序中(.dll或者或者.exe)才能运行。)才能运行。l承载承载WCF的方式如下的方式如下利用利用IIS或者或者WAS承载承载WCF服务(最常用的承载方式)服务(最常用的承载方式) uIISIIS和和IIS ExpressIIS ExpressIIS是微软推出的Web应用服务器,WCF应用程序开发完成后,将其部署在服务器操作系统(例如Windows Server 2008、Windows Server 2012)的IIS中即可。uWASWAS(Windows Process Activation ServiceWindows Process Act
25、ivation Service,WindowsWindows进程激活服进程激活服务)务)利用WAS,不需要将程序部署到IIS中,就可以承载并自动激活WCF服务,而且不需要开发人员编写任何承载代码。227.2.3 承载承载WCF的方式的方式利用利用Windows服务承载服务承载WCF服务服务uWindowsWindows服务是服务是WindowsWindows操作系统提供的功能,操作系统利用进程控操作系统提供的功能,操作系统利用进程控制块来管理它,制块来管理它,WindowsWindows服务一般都是开机自启动的。服务一般都是开机自启动的。u编写编写WCFWCF服务程序时,可以利用服务程序时,可
26、以利用【WCFWCF服务库服务库】模板将模板将WCFWCF服务制作成服务制作成单独的单独的DLLDLL文件,调试程序时系统会自动将其宿主到文件,调试程序时系统会自动将其宿主到WCFWCF服务主机中服务主机中来承载来承载WCFWCF服务,并利用服务,并利用WindowsWindows进程去自动激活它。进程去自动激活它。自承载自承载u自承载自承载WCFWCF是指开发人员自己编写代码实现承载是指开发人员自己编写代码实现承载WCFWCF的工作。的工作。u自承载这种方式本质上是利用自承载这种方式本质上是利用WindowsWindows进程激活服务来承载进程激活服务来承载WCFWCF的,的,但是开发人员不
27、是直接用但是开发人员不是直接用WCFWCF模板来实现承载工作,而是利用模板来实现承载工作,而是利用.NET.NET框框架公开的相关类去实现承载架公开的相关类去实现承载WCFWCF的工作。的工作。237.2.3 承载承载WCF的方式的方式u自承载的优点自承载的优点实现灵活。自承载是所有承载WCF服务的方式中最灵活的一种实现方式。开发人员可在程序中随时启动、关闭和通过代码配置WCF服务,或者通过程序提供的界面,让用户根据需要随时启动和停止服务。可以通过代码选择多种基础传输协议(例如HTTP、TCP、UDP等),也可以通过代码来配置服务。如果使用的是.NET框架4.5及更高版本,还可以完全依赖配置文
28、件来配置。但在.NET框架4.0中,只能通过代码来配置服务。部署自承载程序时,需要的环境支持要求最小。u自承载的缺点自承载的缺点该方案不是面向服务的企业级分布式解决方案。所有承载的实现代码都需要程序员自己去编写。比如需要程序员自己去处理网络监视和避免网络攻击等。7.3 WCF服务端和客户端编程基础服务端和客户端编程基础l7.3.1 WCF服务器端编程模型服务器端编程模型l7.3.2 WCF客户端编程模型客户端编程模型l7.3.3 编写服务端和客户端程序的基本思路编写服务端和客户端程序的基本思路257.3.1 WCF服务器端编程模型服务器端编程模型lVS2012内置了各种编写内置了各种编写WCF
29、服务的模板,开发人员直接利用服务的模板,开发人员直接利用它就可以快速实现它就可以快速实现WCF服务端提供的服务代码服务端提供的服务代码。WCF服务应用程序服务应用程序u该模板利用该模板利用IISIIS自带的自带的WASWAS承载和激活承载和激活WCFWCF服务服务u系统会自动运行系统会自动运行WCFWCF测试客户端(测试客户端(WcfTestClient.exeWcfTestClient.exe)u同一个解决方案中既包括同一个解决方案中既包括WCFWCF服务应用程序项目又包括服务应用程序项目又包括WCFWCF客户端项目时,客户端项目时,运行客户端程序时,该模板会利用运行客户端程序时,该模板会利
30、用WASWAS自动承载并激活自动承载并激活WCFWCF服务。服务。WCF服务库服务库u该模板是利用该模板是利用WCFWCF服务(服务(WcfSvcHost.exeWcfSvcHost.exe)承载并激活)承载并激活WCFWCF服务。服务。u系统会自动运行系统会自动运行WCFWCF测试客户端(测试客户端(WcfTestClient.exeWcfTestClient.exe)u仅适用于需要长时间(开机运行)仅适用于需要长时间(开机运行)WCFWCF服务的场合服务的场合其他模板其他模板u【WCFWCF工作流服务】模板、【工作流服务】模板、【WCFWCF联合服务库】模板联合服务库】模板267.3.1
31、WCF服务器端编程模型服务器端编程模型l编写编写WCF服务端程序有服务端程序有4个主要步骤:选择承载方式、设计和个主要步骤:选择承载方式、设计和实现协定、配置服务、承载服务实现协定、配置服务、承载服务。选择承载方式选择承载方式u编写编写HTTPHTTP应用程序时,一般选择【应用程序时,一般选择【WCFWCF服务应用程序】模板服务应用程序】模板u编写编写TCPTCP应用程序时,既可以选择自承载方式,也可以选择【应用程序时,既可以选择自承载方式,也可以选择【WCFWCF服务应用服务应用程序】模板。程序】模板。u编写编写UDPUDP应用程序时,既可以用自承载方式,也可以用标准绑定。应用程序时,既可以
32、用自承载方式,也可以用标准绑定。277.3.1 WCF服务器端编程模型服务器端编程模型设计和实现协定设计和实现协定的方式的方式u第第1 1种方式是用一个接口公开多个方法,再用一个类实现接口中声明的所有种方式是用一个接口公开多个方法,再用一个类实现接口中声明的所有方法,这是建议的做法。方法,这是建议的做法。优点是可以用接口实现多继承,另外,当修改接口的实现时,只要接口声明不变,就不需要客户端做任何改动。还有,如果升级了版本,而且希望保存原来的接口实现,只需要在接口中增加新的方法声明即可。u第第2 2种方式是不使用接口,而是全部用类来实现种方式是不使用接口,而是全部用类来实现。优点是简单、直观缺点
33、是由于托管类不支持多继承,因此每个类只能实现一个服务协定,或者说有多少个类就不得不公开多少个服务协定。另外,采用这种方式时,服务端修改了任何一行代码,客户端代码也必须做相应修改,否则调用就可能失败,在实际项目中用起来非常不方便。287.3.1 WCF服务器端编程模型服务器端编程模型配置服务配置服务u通过修改配置文件(通过修改配置文件(Web.configWeb.config或者或者App.configApp.config)(建议的方式)(建议的方式)优点是部署服务端应用程序时,不需要修改源程序,只需要修改配置文件即可。u开发人员自己编写代码开发人员自己编写代码承载服务承载服务u服务端设计完成后
34、,运行(承载)服务即可,此时客户端就可以和服务端服务端设计完成后,运行(承载)服务即可,此时客户端就可以和服务端交互了交互了297.3.2 WCF客户端编程模型客户端编程模型l编写编写WCF客户端应用程序时,可使用多种应用程序编程模型客户端应用程序时,可使用多种应用程序编程模型。WPF应用程序应用程序u适用于开发实际的基于适用于开发实际的基于C/SC/S模式的模式的WCFWCF客户端应用程序的场合。客户端应用程序的场合。控制台应用程序控制台应用程序u在实际应用中,一般不会用它来实现。在实际应用中,一般不会用它来实现。其他应用程序其他应用程序uWinFormWinForm应用程序应用程序uWin
35、dowsWindows应用商店应用程序(仅适用于应用商店应用程序(仅适用于Windows 8Windows 8操作系统)操作系统)uASP.NETASP.NETuSilverlightSilverlight307.3.2 WCF客户端编程模型客户端编程模型l编写编写WCF客户端程序的主要步骤客户端程序的主要步骤如下如下利用服务端配置生成客户端代理类和客户端配置利用服务端配置生成客户端代理类和客户端配置u运行运行WCFWCF服务后,客户端可通过【添加服务引用】的办法,让系统自服务后,客户端可通过【添加服务引用】的办法,让系统自动生成客户端代理类,此时它会根据服务端配置(动生成客户端代理类,此时它
36、会根据服务端配置(Web.configWeb.config或者或者App.configApp.config)自动修改客户端配置()自动修改客户端配置(App.configApp.config)编写客户端代码编写客户端代码u客户端添加服务引用后,即可利用自动生成的客户端代理类,编写客户端添加服务引用后,即可利用自动生成的客户端代理类,编写代码与代码与WCFWCF交互。交互。更新客户端配置更新客户端配置u如果服务端配置文件(如果服务端配置文件(Web.configWeb.config或者或者App.configApp.config)发生了改变,)发生了改变,或者接口发生了改变,此时需要在客户端更新
37、服务引用,以便让系或者接口发生了改变,此时需要在客户端更新服务引用,以便让系统重新生成新的客户端配置(统重新生成新的客户端配置(App.configApp.config)317.3.3编写服务端和客户端程序的基本编写服务端和客户端程序的基本思路思路l编写编写WCF程序的基本步骤如下。程序的基本步骤如下。创建服务端项目和客户端项目创建服务端项目和客户端项目编写服务端代码编写服务端代码修改服务端配置修改服务端配置测试服务(可选)测试服务(可选)在客户端添加服务引用在客户端添加服务引用编写客户端调用代码编写客户端调用代码更新服务引用(可选)更新服务引用(可选)l【例【例7-1】通过服务协定演示创建和
38、调用】通过服务协定演示创建和调用WCF的基本设计步骤的基本设计步骤。7.4 设计和实现协定设计和实现协定l7.4.1 协定和特性协定和特性l7.4.2 服务协定服务协定l7.4.3 数据协定数据协定l7.4.4 消息协定消息协定337.4.1 协定和特性协定和特性l协定:协定:WCF在互相传递消息之前预先制定的数据交换规则在互相传递消息之前预先制定的数据交换规则,以以便交换数据的双方能彼此理解对方发送的数据及其格式码便交换数据的双方能彼此理解对方发送的数据及其格式码。l特性:用来声明特性:用来声明服务端定义的所有协定服务端定义的所有协定。在在C#中,中,所有特性类都是从所有特性类都是从Attr
39、ibute类继承而来的,而且其名称都有类继承而来的,而且其名称都有Attribute后缀。后缀。用用C#编写代码时,一律用中括号来声明特性类,声明时省略编写代码时,一律用中括号来声明特性类,声明时省略Attribute后缀,这是建议的用法。后缀,这是建议的用法。特性类的用途是为紧跟在它后面的目标元素提供设计行为。比如对某个特性类的用途是为紧跟在它后面的目标元素提供设计行为。比如对某个字段声明了某个特性,则该特性的目标元素就是这个字段。目标元素可字段声明了某个特性,则该特性的目标元素就是这个字段。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、以是程序集、类、构造函数、委
40、托、枚举、事件、字段、接口、方法、可移植模块、参数、属性(可移植模块、参数、属性(Property)、返回值以及结构等。另外,目)、返回值以及结构等。另外,目标元素还可以是其他特性类。标元素还可以是其他特性类。347.4.1 协定和特性协定和特性l例如:例如:ServiceContractServiceContractpublic interface IService1public interface IService1 OperationContract OperationContract double Add(double n1, double n2); double Add(double
41、 n1, double n2); u这段代码对这段代码对IService1IService1接口用接口用ServiceContractServiceContract特性声明了服务协定,特性声明了服务协定,对对AddAdd方法用方法用OperationContractOperationContract特性声明了操作协定。特性声明了操作协定。u编译器编译这段代码时,遇到编译器编译这段代码时,遇到ServiceContractServiceContract特性声明,它就会自特性声明,它就会自动创建动创建ServiceContractAttributeServiceContractAttribute类
42、的一个实例,并通过该实例处理类的一个实例,并通过该实例处理IService1IService1接口接口。357.4.2 服务服务协定协定l服务协定:服务协定:服务协定是指服务协定是指WCF对客户端公开哪些服务。对客户端公开哪些服务。WCF服务端通过服务协定向客户端公开以下内容:操作方法、消息服务端通过服务协定向客户端公开以下内容:操作方法、消息交换模式、采用的通信协议以及序列化格式交换模式、采用的通信协议以及序列化格式。l服务协定包括服务协定包括ServiceContract特性特性和和OperationContract特特性性。ServiceContract特性用于在应用程序中定义服务协定特
43、性用于在应用程序中定义服务协定。OperationContract特性用于在应用程序中定义特性用于在应用程序中定义操作操作协定协定。367.4.2 服务服务协定协定ServiceContract特性特性常用属性常用属性uCallbackContractCallbackContract:获取或设置双工通信的回调协定类型,默认为:获取或设置双工通信的回调协定类型,默认为nullnull。uNameName和和NamespaceNamespace:获取或设置:获取或设置WebWeb服务描述语言(服务描述语言(WSDLWSDL)中)中元素的名称和命名空间。元素的名称和命名空间。uHasProtecti
44、onLevelHasProtectionLevel:获取一个:获取一个boolbool类型的值,该值指示是否对成类型的值,该值指示是否对成员分配了保护级别。如果分配了保护级别(非员分配了保护级别。如果分配了保护级别(非NoneNone)则为)则为truetrue,否,否则为则为falsefalse。uProtectionLevelProtectionLevel:设置绑定支持的保护级别,默认值为:设置绑定支持的保护级别,默认值为ProtectionLevel.NoneProtectionLevel.None。可选择的值有:。可选择的值有:EncryptAndSignEncryptAndSign(
45、对数据(对数据进行加密和签名确保所传输数据的保密性和完整性)、进行加密和签名确保所传输数据的保密性和完整性)、NoneNone(仅身(仅身份验证)、份验证)、SignSign(对数据签名确保所传输数据的完整性)(对数据签名确保所传输数据的完整性)uSessionModeSessionMode:获取或设置采用的会话模式。:获取或设置采用的会话模式。377.4.2 服务服务协定协定OperationContract特性特性常用属性常用属性uIsOneWayIsOneWay:获取或设置是否不应答消息,默认为:获取或设置是否不应答消息,默认为falsefalse(返回应答的(返回应答的消息)。消息)。
46、uIsInitiatingIsInitiating:获取或设置一个布尔值,该值指示接口中的方法是:获取或设置一个布尔值,该值指示接口中的方法是否在服务端启动会话时就可以实现操作,默认为否在服务端启动会话时就可以实现操作,默认为truetrue。基本用法基本用法u在接口的前面用在接口的前面用ServiceContractServiceContract特性声明服务协定,在接口的内部特性声明服务协定,在接口的内部用操作协定公开操作方法。例如:用操作协定公开操作方法。例如:ServiceContract(Namespace = WcfServiceExamples)public interface I
47、Service1 OperationContract double Add(double n1, double n2); OperationContract double Divide(double n1, double n2);387.4.3 数据数据协定协定l数据协定:数据协定:数据协定是服务端与客户端之间交换数据的约定,数据协定是服务端与客户端之间交换数据的约定,即用某种抽象方式描述要交换的数据并将其传输到客户端即用某种抽象方式描述要交换的数据并将其传输到客户端。l数据协定默认采用数据协定默认采用XML格式。格式。l通过数据协定,客户端和服务端不必共享相同的类型,而只需通过数据协定,客户
48、端和服务端不必共享相同的类型,而只需共享相同的数据协定即可共享相同的数据协定即可。l数据协定利用数据协定利用DataContract特性和特性和DataMember特性声明特性声明。DataContract特性特性定义那些类可以被序列化定义那些类可以被序列化DataMember特性用于声明类中的哪些成员可被序列化特性用于声明类中的哪些成员可被序列化397.4.3 数据数据协定协定l数据协定数据协定的基本用法的基本用法显式声明数据协定和成员协定显式声明数据协定和成员协定:对于显式声明:对于显式声明DataContract特特性和性和DataMember特性的成员进行序列化。特性的成员进行序列化。
49、DataContractDataContractpublic class MyData1public class MyData1 / /不论是不论是privateprivate还是还是publicpublic,只要声明,只要声明DatamemberDatamember就可以序列化就可以序列化 public string MyName1 = me1; / public string MyName1 = me1; /未声明未声明DatamemberDatamember,无法序列化,无法序列化 DataMember public string MyName2 = me2; / DataMember
50、public string MyName2 = me2; /可序列化可序列化 DataMember private string myName3 = me3; / DataMember private string myName3 = me3; /可序列化可序列化 DataMember public int Age get; set; / DataMember public int Age get; set; /可序列化可序列化 DataMember public List MyStudents get; set; / DataMember public List MyStudents get
51、; set; /序列化为数组序列化为数组 private string telephone = null; / private string telephone = null; /无法序列化无法序列化 DataMember DataMember public string Telephone / public string Telephone /可序列化可序列化 get return telephone; get return telephone; set telephone = value; set telephone = value; 407.4.3 数据数据协定协定隐式隐式声明数据协定和
52、成员协定声明数据协定和成员协定: WCF会自动对具有会自动对具有public修饰符的类、修饰符的类、结构、枚举等应用数据协定,对具有结构、枚举等应用数据协定,对具有public修饰符的字段和同时具有修饰符的字段和同时具有get和和set的属性应用成员协定的属性应用成员协定public class Studentpublic class Student/同时具有同时具有getget和和setset并且声明为并且声明为publicpublic的属性默认都拥有成员协定的属性默认都拥有成员协定 public int ID get; set; public int ID get; set; public
53、 string Name get; set; public string Name get; set; public int Score get; set; public int Score get; set; public string OtherInfo get; set; public string OtherInfo get; set; public Student() public Student() ID = 0; ID = 0; Name = Name = 张三张三; Score = 50; Score = 50; OtherInfo = OtherInfo = 无其他信息无其他
54、信息; public override string ToString() public override string ToString() return string.Format( return string.Format(学号:学号:00,姓名:,姓名:1, 1, 成绩:成绩:2, 3,ID, Name, Score, OtherInfo);2, 3,ID, Name, Score, OtherInfo); 417.4.3 数据数据协定协定注意问题注意问题u属性的限制属性的限制将DataMember特性应用于属性时,该属性必须同时具有get和set用隐式声明时,凡是具有public修饰
55、符的字段,都应该用属性来表示。如果直接用public修饰符的字段来表示,必须使用显式声明u构造函数的处理构造函数的处理不要在客户端直接创建服务端提供的类的实例,而是通过客户端代理类来调用u静态成员的处理静态成员的处理只能将DataMember特性应用于字段和属性。【例【例7-2】演示数据协定的基本用法】演示数据协定的基本用法427.4.4 消息消息协定协定l消息协定:在有些情况下,需要消息协定:在有些情况下,需要用单个类型来表示整个消息用单个类型来表示整个消息。使用消息协定可以使用消息协定可以避免在避免在XML序列化时产生不必要的包装序列化时产生不必要的包装。l通过通过MessageContr
56、act特性(特性(MessageContractAttribute类)类)来实现来实现。MessageHeader特性和特性和MessageBodyMember特性特性。u在消息协定的内部,通过在消息协定的内部,通过MessageHeaderMessageHeader特性(特性(MessageHeaderAttributeMessageHeaderAttribute类)指定消息头,通过类)指定消息头,通过MessageBodyMemberMessageBodyMember特性(特性(MessageBodyMemberAttributeMessageBodyMemberAttribute类)指定
57、消息体。类)指定消息体。u可以对所有字段、属性和事件应用可以对所有字段、属性和事件应用MessageHeaderMessageHeader特性和特性和MessageBodyMemberMessageBodyMember特性,而与这些字段、属性和事件的访问修饰符特性,而与这些字段、属性和事件的访问修饰符无关,即不论是无关,即不论是publicpublic、privateprivate、protectedprotected还是还是internalinternal,都能,都能使用这两个特性。使用这两个特性。437.4.4 消息消息协定协定以以RPC样式对消息进行操作样式对消息进行操作。uWCFWCF
58、通过远程过程调用(通过远程过程调用(RPCRPC)对消息协定进行操作,这种操作称为)对消息协定进行操作,这种操作称为RPCRPC样式的操作,这是建议的做法。样式的操作,这是建议的做法。u在在RPCRPC样式的操作中,消息协定中操作协定的声明办法和服务协定中样式的操作中,消息协定中操作协定的声明办法和服务协定中操作协定的声明办法完全相同,也就是说,都可以使用多个参数,操作协定的声明办法完全相同,也就是说,都可以使用多个参数,包括带包括带refref和和outout的参数。的参数。u【例【例7-37-3】演示消息协定的基本用法】演示消息协定的基本用法。447.4.4 消息消息协定协定以以Messa
59、ge样式对消息进行操作样式对消息进行操作。u对于以下情况,用对于以下情况,用MessageMessage样式对消息进行操作,而不用样式对消息进行操作,而不用RPCRPC样式。样式。需要插入自定义的SOAP标头。希望分别定义消息头和正文的安全属性(例如使用与默认安全级别不同的数字签名和加密保护等)。有些第三方的SOAP要求以特定的格式发送邮件。u使用消息样式时,接口中的操作方法只允许最多有一个参数和一个使用消息样式时,接口中的操作方法只允许最多有一个参数和一个返回值,而且参数和返回值的类型都必须是消息类型返回值,而且参数和返回值的类型都必须是消息类型。7.5 服务绑定与终结点配置服务绑定与终结点
60、配置l7.5.1 在服务端配置文件中配置在服务端配置文件中配置WCF服务服务l7.5.2 终结点绑定方式终结点绑定方式l7.5.3 需要绑定的元素及其含义需要绑定的元素及其含义467.5.1在服务端配置文件中配置在服务端配置文件中配置WCF服务服务l用【用【WCF服务应用程序】模板创建服务应用程序】模板创建WCF服务项目时,服务端服务项目时,服务端配置信息保存在项目的配置信息保存在项目的Web.config文件中,客户端应用程序中文件中,客户端应用程序中的配置信息保存在项目的的配置信息保存在项目的App.config文件中。文件中。l用自承载用自承载WCF创建创建WCF服务项目时,或者用【服务
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院供氧室工作制度
- 医院培训师工作制度
- 医院院务会工作制度
- 单位共青团工作制度
- 博物馆安保工作制度
- 卫生局防火工作制度
- 卫生院妇保工作制度
- 卫计委医政工作制度
- 厨师八小时工作制度
- 县双拥工作制度汇编
- 2026年注册土木工程师(水利水电工程水工结构专业知识考试上)试题及答案
- 2025贝特瑞新材料集团股份有限公司招聘5人历年真题汇编带答案解析
- 2026年咨询工程师咨询实务考前重点知识考点总结记忆笔记
- 2026全国肿瘤防治周宣传:健康生活筑基科学防癌护航
- 电动单梁吊车施工方案
- 初中必背名著导读考点梳理(12本)
- 黑热病防疫知识培训课件
- 5.《雷雨(节选)》课件+2025-2026学年统编版高一语文必修下册
- 乡村振兴驻村帮扶工作计划
- 园艺花卉技师题库及答案
- 初级养老护理员练习题附答案
评论
0/150
提交评论