.NETWCF技术培训李元波CSDN微软技术高级讲师liyuanbo@gmail.com课程目标从SOA说起什么是WCFWCF通信模型Endpoint与ABC以及元数据契约编程WCFbinding协议托管与宿主消息模式WCF行为-实例管理和并发控制安全项目实战-基于WCF的聊天室从SOA说起S-ServerService是公开的一组功能的集合SOAServiceOrientedArchitecture一种组件架构模型主要特点每个服务具有明确的服务边界。服务独立,低耦合。采用标准的契约定义和通信协议。服务是自解释的。什么是WCFWCFWindowsCommunicationFoundation是微软为SOA(Service-OrientedArchitecture)而设计的一套完整的技术框架什么是WCFWCF通过WCF技术可以创建服务跨进程跨机器跨网络WCF提供了创建安全的、可靠的、事务服务、多种协议的统一框架WCF整合和扩展了现有分布式系统的开发技术,如Microsoft.NetRemoting、WebServices、WebServicesEnhancements(WSE)等等。WCF-各种分布式技术统一江湖•WCF与其他分布式技术对比表Hello,WCF-第一个WCF程序通过实例了解什么是WCF1建立WCF服务2建立客户端调用WCF服务。WCF通信模型客户端和服务端之间通信的方式服务与协定-Contract服务端可以提供什么服务?指定一个规则Contract协定,契约,合同Contract分类协定分类ServiceContract定义了服务的类型,用一个接口或类订阅WCF的ServiceContract。OperationContract:定义了WCF服务中提供给外部系统访问的方法。DataContract:自定义的复杂数据类型MessageContract用于控制SOAP消息的规则FaultContract用于捕获服务端错误消息4个最主要组件WCF服务4个最主要组件及其关系ServiceContractOperationContractDataContractDataMemberDemo-天气预报服务功能设计:获取某一城市的天气情况目标:编写服务掌握服务协定掌握操作协定掌握数据协定步骤:1完成一个普通天气预报接口2实现该接口Demo-天气预报服务1建立普通的天气预报模块1简单的天气信息类WeatherInfo城市名称天气情况2完成一个普通天气预报接口IWeatherService,包含下面方法:WeatherInfoGetWeatherInfo(stringcity);3实现该接口,WeatherService类2普通模块向WCF服务的变身WCF中的基本概念-EndpointEndpoint终节点建立相互关联中的各个Application的通信通道。用来发送或接收消息(或同时执行这两种操作)的入口。WCF中的基本概念-ABCABCA:Addresswhere-服务在哪里B:Bindinghow-通过什么协议取得服务C:Contractwhat-定义的服务是什么WCF中的基本概念-Endpoint与ABCEndPoint与ABC包含关系WhereWhatHow特殊的Endpoint-Mex节点回忆SOA的特点元数据Mex节点Demo-天气预报服务1功能:建立Endpoint-访问服务的入口目标编写配置文件初步掌握Endpoint和ABC掌握Mex节点初步掌握WCFConfigureEditorBinding绑定Binding的作用指明通过什么方式(协议)连接WCF服务。常用协议Binding协议传输协议描述basicHttpBindinghttphttps最简单的绑定类型,通常用于WebServices。使用HTTP协议,Text/XML编码方式。wsHttpBindinghttphttpsHTTP绑定的一种高级形式,比BasicHttpBinding更加安全,可以使用WSE中引入的所有额外功能,通常用于non-duplex服务通讯。wsDualHttpBindinghttp扩展了WSHttpBinding功能,包含双向通信功能。netTcpBindingTCP用于TCP通信,允许配置安全性、事务处理等,效率高netNamedPipeBindingIPC在wcf应用程序中最适合本机进行安全通讯的binding,安全、可靠、高效netMsmqBindingMSMQ用于消息队列通信,支持排队Binding绑定Binding协议的选择Address地址Address地址的作用通过一个URIEndpoint告诉潜在的WCFservice的调用者如何找到这个WCFService。表现形式HTTP协议:://server:port/serviceTCP协议:net.tcp://server:port/service管道:net.pipe://server/serviceMQ:net.msmq://server/public(private)/serviceDemo-天气预报服务1功能:通过多种binding协议访问服务目标编写配置文件初步认识主要的协议进一步掌握EndpointWCF通信模型(详尽)客户端和服务端之间通信的方式获取客户端代理类Svcutil.exe工具步骤1:生成服务描述文件svcutil[serviceassembly]步骤2:生成可以提供客户端的ProxyClass和配置文件svcutil*.wsdl*.xsd/language:C#/out:ProxyClass.cs/config:app.configDemo-天气预报服务1功能:建立第二个天气预报客户端,使用新制作的代理类,使用svcutil制作代理类使用wcfconfigureeditor编写app.config托管与宿主托管宿主Host承载WCFService运行的环境自承载方式系统服务方式IIS方式WASDemo-天气预报服务1功能:建立Winform宿主,关键代码ServiceHosthost=newServiceHost(serviceType);host.Open();消息模式消息模式客户端与服务器之间是进行消息通讯的方式三种主要消息模式单向OneWay请求/答复Request/Reply双工Duplex消息模式-单向模式单向模式OneWayCall指的是发送端负责把消息发送给对方并且收到本地发出信息的确认消息之后,就完成交互的方式。特点未知:消息是否最终到达服务的终节点已知:消息发送成功一般只能为返回void的操作指定单向消息交换OperationContractAttribute的IsOneWay属性需要设置为True,默认为false.[OperationContract(IsOneWay=true)]voidMethod();消息模式-请求/答复请求/答复模式Request/Reply客户端发送一个消息并且接收一个返回消息来完成一次交互特点请求方(客户端应用程序)发出请求以后,一直等待对方(WCF方)答复。这是默认的模式[OperationContract]voidMethod();Demo-请求/答复模式与单向模式功能设计:预报员提交未来天气信息目标:使用两种模式来观察其区别添加新的OperationContract:voidAddWeathinfo(WeatherInfoinfo);修改客户端比较结果消息模式-双工模式双工模式duplex客户端和服务端都可以任意地向对方发送消息,而对方也可以以任意的次序来接收消息。服务端:1需要设计用于回调的服务协定,2将该回调协定的类型分配给ServiceContractAttributeAttribute的CallbackContractproperty。客户端:1要对该接口实现消息模式-双工模式ServiceClientHeartBeatCallBackForexample:ChangeHeartbeatInterval消息模式-双工模式主要代码1.publicinterfaceICallBack2.{3.[OperationContract(IsOneWay=true)]4.voidChangeInterval(intseconds);5.}6.[ServiceContract(CallbackContract=typeof(ICallBack))]7.publicinterfaceIService18.{9.[OperationContract]10.voidHeartbeat();11.}Demo-HeartBeat及间隔调整功能设计:1客户端调用服务端发送心跳通知2服务端回调,调整心跳频率练习-天气信息定时预报功能设计:定时接收天气预报信息1客户调用服务端方法,设置每天接受信息的时间2服务端每天到时发送天气信息给客户WCFBehavior什么是BehaviorBehavior即各种影响WCF系统运行的设置。包括服务行为(ServiceBehavior)和操作行为(OperationBehavior)服务行为作用在终节点上(实例控制、并发控制、元数据发布等)操作行为作用于某一服务操作上(事务流设置等。主要的Behavior实例管理并发管理元数据发布管理事务2个主要的服务行为实例管理如何为不同的Client生成Serviceinstance,以及何时销毁instance并发管理多线程实例管理重要的枚举publicenumInstanceContextMode{PerSession=0,PerCall=1,Single=2}修饰服务类ServiceBehavior特性,InstanceContextMode属性PerCall实例管理Client://Client多次调用proxy.Operate();proxy.Operate();proxy.Operate();Demo-PerCall实例管理DemoSingle,PerSession实例管理[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)][ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]单件实例会话实例PerSession实例管理默认的实例管理严格的实例管理ServiceContract上SessionMode设置ServiceBehavior上InstanceContextMode设置选择合适的bindingDemo-PerSession实例管理Demo1实例代码2回顾HeartBeatDuplexDemoDemo-Single实例管理Demo更改HeartBeatDuplexDemoWCFBehavior-并发管理ServiceBehavior中设置ConcurrencyModepublicenumConcurrencyMode{Single=0,Reentrant=1,Multiple=2}WCFBehavior-并发管理Demo1.[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,2.ConcurrencyMode=Concurre