分享
分销 收藏 举报 申诉 / 44
播放页_导航下方通栏广告

类型服务契约.pptx

  • 上传人:天****
  • 文档编号:11420259
  • 上传时间:2025-07-22
  • 格式:PPTX
  • 页数:44
  • 大小:495.64KB
  • 下载积分:12 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    服务 契约
    资源描述:
    ,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2019/10/27,#,如何在,WCF,服务中设计服务契约,了解常用的消息交换模式(,MEP,),掌握异步调用方法,掌握双工通信,本次课程内容包括,服务契约,服务契约是对服务端点之间传递消息的描述,是服务所实现的功能操作。将,.NET,类型中的类方法映射到,WSDL,中的服务、端口类型及操作,。,消息,消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头。,服务,服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。,终结点,终结点是用来发送或接收消息(或执行这两种操作)的构造。终结点包括一个定义消息可以发送到的目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定)以及对于可以在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定),该定义还描述了可以发送何种消息。,WCF,服务作为一个终结点集合向外界公开。,创建服务协定,WCF,术语,SOA,体系结构,服务契约描述了一个服务端点所实现的操作接口。服务契约将,.net,类型中的类方法映射到,WSDL,中的服务、端口类型及操作。服务契约中标有,OperationContract,的方法都将在,WSDL,中发布。,服务契约,-,-,ServiceContract,public interface IService,OperationContract,string GetData(int value);,OperationContract,CompositeType GetDataUsingDataContract(CompositeType composite);,是一种,XML,格式,它将网络服务描述为一组端点,端点对包含有文档或过程相关信息的消息进行操作。操作与消息首先被抽象地定义,之后与实际网络协议及消息格式绑定,以定义端点。,WSDL,具备可扩展性,无论消息采用何种格式,或者网络以什么协议通信,都可以对端点与消息加以描述。,契约是在,WSDL,和,XSD,(除,CLR,基类型外自定义的类型用,XSD,表示)定义,而代码通常使用,CLR,类型,如何映射?,第一用,ServiceContract,、,OperationContract,、,DataContract,等,第二是通过客户端代理将,CLR,与方法序列化为,xml,。,WSDL,在,.NET,端,CLR,类型定义了数据结构或功能,在,XML,端,XSD,定义了数据结构,两者之间的映射工具:,SvcUtil.exe,和添加服务引用,当然服务端也有相应的工作,即用,ServiceContract,、,OperationContract,、,DataContract,等,定义服务协定,在类或接口上使用,ServiceContractAttribute,属性标记,定义服务操作,在方法上使用,OperationContractAttribute,属性对其进行标记(所有的方法都必须用该标记),参数和返回值,每个操作都有一个返回值和一个参数,即使它们为,void,。,参数或返回值中使用的每个类型都必须是可序列化的,换言之,该类型的对象必须能够转换为字节流,并能够从字节流转换为对象。,默认情况下,,CLR,内建基元类型,(,编译器直接支持的数据类型称为,基元类型,),是可序列化的,,.NET Framework,中的很多类型都是可序列化的。,后面介绍序列化的相关知识,创建服务协定,ServiceContract,public interface IService,OperationContract,string Hello(string name);,能够显式地指定,Name,NameSpace,ServiceContract(,Name=ContentManagerContract,Namespace=,/samples/2007/07),public interface IContentManagerService,ServiceContractAttribute,服务契约中的所有方法都应该拥有,OperationContractAttribute,ServiceContract,public interface IService,OperationContract,(,Name=“Hello1”,),string Hello(string name);,能够显式地指定,Name,Action,ReplyAction,(,wsdl:input,和,wsdl:output,元素。这些元素的顺序 暗示了在一个响应消息发送以前,请求消息必须先被接收),OperationContractAttribute,使用,MessageParameterAttribute,来控制,参数或者返回名称,ServiceContract,public interface IContentManagerService,OperationContract,void SaveLink(,MessageParameter(Name=LinkItem),(LinkItem item);,OperationContract,return:MessageParameter(Name=LinkItem),LinkItem GetLink(string id);,MessageParameterAttribute,demo,参考例子:,ExplicitServiceContracts,MEP,:,Message Exchange Pattern,,消息交换模式。,WCF,服务端与客户端间的信息相换的过程类似于打电话。很明显,当一个人要和另一人进行电话联系时,他必须先拨号,等对方摘机接听,然后双方一问一答,最后两人先后挂机,,只有遵循这个流程,通话才能顺利进行。,类似地,,MEP,就起到规定,WCF,服务端与客户端“通话”流程的作用。,掌握常用的,MEP,编程方法,是进行,WCF,开发的基本要求。,什么是,MEP?,请求,/,响应模式:客户端发出请求,服务端响应,然后客户端再发出下一个请求,,即“一问一答”。,单向模式:客户端发出请求后不需要回应,客户端需要得到发送确认,即“发送确认模式”,双向模式:客户端可以向服务端发出服务请求,服务端反过来也可以调用客户端的服务。,事件发布与订阅模式:,WCF,服务端发布一个事件,多个客户端可以订阅这个事件。这是“双向模式”的变种。,P2P,模式:不区分客户端与服务端,或者说,所有的参与者既是客户端又是服务端。,MEP,种类,请求,/,响应是,WCF,默认的,MEP,模式。,使用这种模式时,客户方发出服务调用请求后,要等待服务端发回响应后,方法才返回。,即使服务协定中的方法返回值类型为,void,,服务端仍将向客户端发出一个空的响应消息。客户端会在发出请求的线程上阻塞等待此消息。,当发生通讯故障或超时时,客户端代理对象引发,CommunicationException,或,TimeoutException,。,请求,/,响应模式,请求,/,答复,看书,p32,通过请求,/,答复模式,请求发送方(客户端应用程序)将接收与请求相关的答复。它既支持传入操作(一个或多个参数传递到该操作中),也支持返回操作(该操作将一个或多个输出值传回给调用方),创建服务协定,-,服务操作的消息模式,1,请注意,除非指定其他基础消息模式,否则,即使服务操作返回,void,(在,Visual Basic,中为,Nothing,),也属于请求,/,答复消息交,换。,操作的结果是:除非客户端异步调用操作,否则客户端将停止处理,直到收到返回消息,即使该消息正常情况下为空时也是如此。,缺点,如果执行操作需要很长的时间,则会降低客户端性能和响应能力,创建服务协定,-,服务操作的消息模式,1,两种方式:,同步调用(同前面的例题),异步调用,本章例题:异步加法,clientbase,客户端,2,同,WCF,习题中:,异步加法,channelf,方式,比较,异步调用做法:,使用,.NET,框架中异步编程模式为客户端引入异步行为,可以使对任何同步方法的调用以异步方式进行,引入,IAsyncResult,类,并创建,Begin,*和,End,*方法。,客户端先调用,Begin,*,后继续执行,当前线程中,的方法,每调用一次,Begin,*,客户端稍后都要调用一次,End,*方法取得结果。,客户端传递一个代理给,Begin,*,在异步操作被调用时,代理也被调用,可以存储,Begin,*调用的状态。,ServiceReference2.CalculateClient,channel,=new clientbase1.ServiceReference2.CalculateClient();,IAsyncResult ar=channel.BeginAdd(1,2,Addcallback,,,channel),;,P36,(例题本章:异步加法,clientbase,客户端,2,,,WcfServiceLibrary2,双工),对于请求,/,答复模式的客户端,也可以定义一个异步回调函数,Static void AddCallBack(IAsyncResult ar),double d=(serviceClient)ar.AsyncState).EndAdd(ar);,Interlocked.Decrement(ref c);,(,例题:本章课件:异步加法,clientbase,客户端,1),改写:,IAsyncResult ar=channel.BeginAdd(1,2,delegate Console.WriteLine(CallBack.);,channel);,IAsyncResult ar=channel.BeginAdd(1,2,AddCallBack,channel);,IAsyncResult ar=channel.BeginAdd(3,4,callBack,channel,);,包含,public static AsyncCallback,callBack,get;set;,定义,AsyncResult ar=channel.BeginAdd(1,2,delegate Console.WriteLine(CallBack.);,null,);,第三个参数定义了一个,beginadd,方法调用结束后调用的一个本地方法,第四个参数可以是任何对象,用于发起例程和,AsyncCallback,之间进行状态沟通,客户端只管发出调用,不再理会此消息是否到达到服务端,也不要求服务端发回响应消息。在该模式下:,没有返回值,返回类型只能为,void,不能包含,ref,或者,out,类型的参数,只有客户端发起请求,服务端并不会对请求进行回复。,通过设置,OperationContract,的,IsOneWay=True,可以将满足要求的方法设置为这种消息交换模式:,OperationContract(,IsOneWay=true),单向模式,ServiceContract,interface IMyContract,OperationContract(,IsOneWay=true),void MyMethod();,OperationContract,void MyMethodslow();,public class CalculatorService:IMyContract,public void,MyMethod,(),Thread.Sleep(1000);/,立即返回,public void,MyMethodslow,(),Thread.Sleep(1000);/,等待十秒,单向操作是客户端调用操作并在,WCF,将消息写入网络后继续进行处理的操作。通常,除非在出站消息中发送的数据极其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。此种类型的消息交换模式支持从客户端到服务应用程序的类似于事件的行为。,若要为返回,void,的操作指定单向消息交换,请将,IsOneWay,属性设置为,true,,默认为,false.,创建服务协定,-,服务操作的消息模式,2,此方法与前面的请求,/,答复示例相同,但是,将,IsOneWay,属性设置为,true,意味着尽管方法相同,服务操作也不会发送返回消息,而客户端将在出站消息抵达通道层时立即返回,创建服务协定,-,服务操作的消息模式,2,双向模式下,客户端与服务端之间的数据交换是双向的,客户端既可以调用服务端的方法,服务端也可以反过来“回调(,call back,)”客户端的方法。,因此,客户端在发出调用请必须准备好可供服务端“回调”的方法,这是双向模式的重要特征。,双向模式,由于客户端必须提供一个回调方法供服务端调用,因此,需要绑定支持数据的双向流动。,双向模式只适用于三种类型的绑定:,TCP,、,NamedPipe,(命名管道)和,WSDualHttpBinding,。,对于支持双向通讯的协议,比如,TCP,和命名管道,只需复用原有的通道即可。,HTTP,协议本质上是一种无状态的“请求,/,响应”数据交换模式,不支持服务端回调客户端,为了实现双向模式,,WCF,创建了另一个回调通道以实现双向通讯,基类库中的,WSDualHttpBinding,实现了基于,HTTP,协议的双向模式。,双向模式使用的绑定,双工模式的特点:,1.,无论使用单向消息发送还是请求,/,答复消息发送方式,服务和客户端均能够独立地向对方发送消息。消息交换过程中,服务端和客户端角色会发生调换。,2.,服务端处理完请求后,返回给客户端的不是,reply,,而是,callback,请求。,由于存在与客户端通信的附加机制,双向模式比请求,/,答复或单向模式要略为复杂,若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的,ServiceContractAttribute,属性,(attribute),的,CallbackContract,属性,(property),。,若要实现双工模式,必须创建第二个接口,该接口包含在客户端调用的方法声明。,如果用“添加服务引用”生成客户端代理,代理定义的接口名称是有服务名后加“,Callback,”,客户端必须实现由此接口派生的类。,创建服务协定,-,服务操作的消息模式,3,创建服务协定,-,服务操作的消息模式,3,ServiceContract(Namespace=CallbackContract=typeof(ICallback),public interface ICalculator,OperationContract(IsOneWay=true),void Add(double x,double y);,public interface ICallback,OperationContract(IsOneWay=true),void DisplayResult(double x,double y,double result);,WcfServiceLibrary2,双工,dome,1.,定义服务方契约,public interface,IService1,OperationContract(IsOneWay=true),void Add(double a,double b);,OperationContract(IsOneWay=true),void Minus(double a,double b);,2,创建回调接口即回调契约,public interface,IService1CallBack,OperationContract(IsOneWay=true),void GetAdd(string result);,OperationContract(IsOneWay=true),void GetMinus(string result);,双工 创建步骤:,3.,将回调接口应用到服务契约上,将两个代码连接,ServiceContract(SessionMode=SessionMode.Required,/,可以不加,CallbackContract=typeof(IService1CallBack),public interface IService1,OperationContract(IsOneWay=true),void Add(double a,double b);,OperationContract(IsOneWay=true),void Minus(double a,double b);,4.,服务类完成服务,,/,需要添加服务行为,ServiceBehavior,public class Service1:IService1,IService1CallBack serviceCallBack=null;,public Service1(),serviceCallBack=OperationContext.Current.GetCallbackChannel();,public void Add(double a,double b),string result=string.Format(0+1=2,a,b,a+b);,serviceCallBack.GetAdd(result);,public void Minus(double a,double b),string result=string.Format(0-1=2,a,b,a-b);,serviceCallBack.GetMinus(result);,5.,客户端实现回调接口,public class ServiceClient:IService1Callback,public void GetAdd(string result),Console.WriteLine(result);,public void GetMinus(string result),Console.WriteLine(result);,6.,托管服务(使用支持双工通信的绑定),7.,客户端代理生成,需要使用,InstanceContext,类,该对象存储着服务的环境信息。,InstanceContext,instanceContext=new InstanceContext(new,ServiceClient(),),/,回调服务,最好起名为,Service1CallBack,ServiceReference2.IserviceClient proxy=new client.ServiceReference2.IserviceClient(instanceContext);,NetTcpBinding,和,NetNamedPipeBinding,绑定支持回调操作;,WSDualHttpBinding,绑定是通过设置两个,HTTP,信道来支持双向通信,例子:,a.Service Request,:,客户端向服务端发出调用,在调用的过程中会把回调实例的引用一起发送到服务端去。,b.Callback Request,:,服务端从上一步的请求中取得对回调实例的引用,通过该回调实例向客户端发出的回调请求。,c.Callback Response,:,客户端执行完回调后向服务端返回的响应,如果回调契约中的方法契约被定义为,IsOneWay,的话,这一步不会发生。,d.Service Response,:,服务端方法执行完后向客户端返回信息(方法的返回值等)。,ServiceContract(,CallbackContract=typeof(IWCFCallBack),public interface IWCFService,OperationContract,string SayHelloToUser();,/ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant),public class WCFService:IWCFService,IWCFCallBack callback=OperationContext.Current.GetCallbackChannel();,public string SayHelloToUser()callback.SayHelloCallBack();return WCF Service +DateTime.Now.ToString();,a.ServiceContract(CallbackContract=typeof(IWCFCallBack),把服务契约与回调契约联系起来,b.ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant),这一句并不是非要加,如果回调契约中的方法契约是,oneway,操作时,则不需要加。,c.IWCFCallBack callback=OperationContext.Current.GetCallbackChannel();,当客户端向服务端发送请求的时候会把回调信息一起发送到服务端,在服务端可以通过上面的方法,在当前的操作上下文中获取当前操作的客户端的回调通道,通过这个回调通道对象来调用客户端的回调方法。,1,定义服务契约,public interface,IWCFCallBack,OperationContract(IsOneWay=true),void SayHelloCallBack();,回调契约中的方法契约声明为单向操作契约,OperationContract(IsOneWay=true),,意味着服务端对客户端的回调只单向调用。这里的方法契约可以声明为单向操作也可不声明为单向操作,究竟是否需要设置为单向操作,要根据服务的并发状态来判断:如果服务并发状态是,ConcurrencyMode.Reentrant,,则回调方法契约不需要单向操作,否则需要单向操作。,2,定义回调契约,3,托管服务(使用支持双工通信的绑定),在服务器端定义了回调契约,,,在生成代理类的时候,会在客户端生成对应的回调契约,但回调契约的名子发生了变化。,客户端生成的回调契约并不与服务器端的回调契约一致,而是在服务端的服务契约之后加上,CallBack,来命名的,,这是因为客户端的回调契约就是通过服务契约声明来取得的。,4,客户端代理生成,class,ClientCallBack:CallBackOP.IWCFServiceCallback,public void,SayHelloCallBack(),Console.WriteLine(callback is writting);,5,根据变化实现客户端回调契约,(客户端定义回调契约),ClientCallBack cc=new ClientCallBack();,InstanceContext context=new InstanceContext(cc);,CallBackOP.WCFServiceClient ws=new Client.CallBackOP.WCFServiceClient(,context,);,ws.SayHelloToUser();,Console.ReadLine();ws.Close();,“实例上下文(,InstanceContext,)”对象,,,该对象中包含回调对象的实例,调用服务端方法的时候,实例上下文被一起传递给服务端,这样服务端就知道了客户端回调对象的信息了。,6,客户端调用,a.,在客户端类中把代理类作为成员变量,在相应的方法中实例化代理类,通过代理调用服务。,b.,让当前类实现,IDisposable,接口,并在,Dispose(),方法中关闭代理。,另一种客户端方法,class,Program:CallBackOP.IWCFServiceCallback,IDisposable,private CallBackOP.WCFServiceClient prox=null;public void,SayHelloCallBack(),Console.WriteLine(callback is writting);public void CallService(),InstanceContext context=new InstanceContext(this);prox=new Client.CallBackOP.WCFServiceClient(context);string str=prox.SayHelloToUser();,Console.WriteLine(Client:+str);public void,Dispose(),prox.Close();static void Main(string args),Program p=new Program();p.CallService();,Console.ReadLine();,在一个纯,P2P,应用程序中每个参与者对于网络中的其他参与者而言既是客户机又是服务器。,P2P,应用程序之间通过啮,nie,合网,啮合网事一组相互连接的对等节点。,PNRP,一个分布式名称解析协议,用,PNRP,来发现其他节点。,对等网络,
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:服务契约.pptx
    链接地址:https://www.zixin.com.cn/doc/11420259.html
    页脚通栏广告

    Copyright ©2010-2025   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork