《服务契约》PPT课件.ppt

上传人:小飞机 文档编号:5530304 上传时间:2023-07-18 格式:PPT 页数:45 大小:1.39MB
返回 下载 相关 举报
《服务契约》PPT课件.ppt_第1页
第1页 / 共45页
《服务契约》PPT课件.ppt_第2页
第2页 / 共45页
《服务契约》PPT课件.ppt_第3页
第3页 / 共45页
《服务契约》PPT课件.ppt_第4页
第4页 / 共45页
《服务契约》PPT课件.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《《服务契约》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《服务契约》PPT课件.ppt(45页珍藏版)》请在三一办公上搜索。

1、服务契约,蒋美云,如何在WCF服务中设计服务契约了解常用的消息交换模式(MEP)掌握异步调用方法掌握双工通信,本次课程内容包括,服务契约服务契约是对服务端点之间传递消息的描述,是服务所实现的功能操作。将.NET类型中的类方法映射到WSDL中的服务、端口类型及操作。消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头。服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。终结点 终结点是用来发送或接收消息(或执行这两种操作)的构造。终结点包括一个定义消息可以发送到的目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定)以及对于可以

2、在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定)该定义还描述了可以发送何种消息。WCF 服务作为一个终结点集合向外界公开。,创建服务协定WCF术语,SOA体系结构,服务契约描述了一个服务端点所实现的操作接口。服务契约将.net类型中的类方法映射到WSDL中的服务、端口类型及操作。服务契约中标有OperationContract的方法都将在WSDL中发布。,服务契约,-,ServiceContractpublic interface IServiceOperationContractstring GetData(int value);OperationContractComposit

3、eType GetDataUsingDataContract(CompositeType composite);,是一种XML格式,它将网络服务描述为一组端点,端点对包含有文档或过程相关信息的消息进行操作。操作与消息首先被抽象地定义,之后与实际网络协议及消息格式绑定,以定义端点。WSDL具备可扩展性,无论消息采用何种格式,或者网络以什么协议通信,都可以对端点与消息加以描述。契约是在WSDL和XSD(除CLR基类型外自定义的类型用XSD表示)定义,而代码通常使用CLR类型,如何映射?第一用ServiceContract、OperationContract、DataContract等,第二是通过客

4、户端代理将CLR与方法序列化为xml。,WSDL,在.NET端CLR类型定义了数据结构或功能,在XML端XSD定义了数据结构两者之间的映射工具:SvcUtil.exe和添加服务引用当然服务端也有相应的工作,即用ServiceContract、OperationContract、DataContract等,定义服务协定在类或接口上使用ServiceContractAttribute 属性标记定义服务操作在方法上使用OperationContractAttribute 属性对其进行标记(所有的方法都必须用该标记)参数和返回值 每个操作都有一个返回值和一个参数,即使它们为void。参数或返回值中使用

5、的每个类型都必须是可序列化的,换言之,该类型的对象必须能够转换为字节流,并能够从字节流转换为对象。默认情况下,CLR内建基元类型(编译器直接支持的数据类型称为基元类型)是可序列化的,.NET Framework 中的很多类型都是可序列化的。后面介绍序列化的相关知识,创建服务协定,ServiceContract public interface IService OperationContract string Hello(string name);能够显式地指定Name,NameSpaceServiceContract(Name=ContentManagerContract,Namespace

6、=http:/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元素。这些元素的顺序 暗示了在一

7、个响应消息发送以前,请求消息必须先被接收),OperationContractAttribute,使用MessageParameterAttribute来控制参数或者返回名称ServiceContractpublic interface IContentManagerService OperationContract void SaveLink(MessageParameter(Name=LinkItem)(LinkItem item);OperationContract return:MessageParameter(Name=LinkItem)LinkItem GetLink(string

8、 id);,MessageParameterAttribute,demo,参考例子:ExplicitServiceContracts,MEP:Message Exchange Pattern,消息交换模式。WCF服务端与客户端间的信息相换的过程类似于打电话。很明显,当一个人要和另一人进行电话联系时,他必须先拨号,等对方摘机接听,然后双方一问一答,最后两人先后挂机,只有遵循这个流程,通话才能顺利进行。类似地,MEP就起到规定WCF服务端与客户端“通话”流程的作用。掌握常用的MEP编程方法,是进行WCF开发的基本要求。,什么是MEP?,请求/响应模式:客户端发出请求,服务端响应,然后客户端再发出下

9、一个请求,即“一问一答”。单向模式:客户端发出请求后不需要回应,客户端需要得到发送确认,即“发送确认模式”双向模式:客户端可以向服务端发出服务请求,服务端反过来也可以调用客户端的服务。事件发布与订阅模式:WCF服务端发布一个事件,多个客户端可以订阅这个事件。这是“双向模式”的变种。P2P模式:不区分客户端与服务端,或者说,所有的参与者既是客户端又是服务端。,MEP种类,请求/响应是WCF默认的MEP模式。使用这种模式时,客户方发出服务调用请求后,要等待服务端发回响应后,方法才返回。即使服务协定中的方法返回值类型为void,服务端仍将向客户端发出一个空的响应消息。客户端会在发出请求的线程上阻塞等

10、待此消息。当发生通讯故障或超时时,客户端代理对象引发CommunicationException或TimeoutException。,请求/响应模式,请求/答复看书p32 通过请求/答复模式,请求发送方(客户端应用程序)将接收与请求相关的答复。它既支持传入操作(一个或多个参数传递到该操作中),也支持返回操作(该操作将一个或多个输出值传回给调用方),创建服务协定-服务操作的消息模式1,请注意,除非指定其他基础消息模式,否则,即使服务操作返回void(在Visual Basic 中为Nothing),也属于请求/答复消息交换。操作的结果是:除非客户端异步调用操作,否则客户端将停止处理,直到收到返回

11、消息,即使该消息正常情况下为空时也是如此。,缺点 如果执行操作需要很长的时间,则会降低客户端性能和响应能力,创建服务协定-服务操作的消息模式1,两种方式:同步调用(同前面的例题)异步调用,本章例题:异步加法clientbase客户端2,同WCF习题中:异步加法channelf方式比较异步调用做法:使用.NET框架中异步编程模式为客户端引入异步行为,可以使对任何同步方法的调用以异步方式进行引入IAsyncResult类,并创建Begin*和End*方法。客户端先调用Begin*,后继续执行当前线程中的方法,每调用一次Begin*,客户端稍后都要调用一次End*方法取得结果。客户端传递一个代理给B

12、egin*,在异步操作被调用时,代理也被调用,可以存储Begin*调用的状态。ServiceReference2.CalculateClient channel=new clientbase1.ServiceReference2.CalculateClient();IAsyncResult ar=channel.BeginAdd(1,2,Addcallback,channel);P36(例题本章:异步加法clientbase客户端2,WcfServiceLibrary2双工),对于请求/答复模式的客户端,也可以定义一个异步回调函数Static void AddCallBack(IAsyncRe

13、sult 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,c

14、allBack,channel);包含public static AsyncCallback callBack get;set;定义AsyncResult ar=channel.BeginAdd(1,2,delegate Console.WriteLine(CallBack.);,null);第三个参数定义了一个beginadd方法调用结束后调用的一个本地方法,第四个参数可以是任何对象,用于发起例程和AsyncCallback之间进行状态沟通,客户端只管发出调用,不再理会此消息是否到达到服务端,也不要求服务端发回响应消息。在该模式下:没有返回值,返回类型只能为void 不能包含ref或者out

15、类型的参数 只有客户端发起请求,服务端并不会对请求进行回复。通过设置OperationContract的IsOneWay=True可以将满足要求的方法设置为这种消息交换模式:OperationContract(IsOneWay=true),单向模式,ServiceContractinterface IMyContract OperationContract(IsOneWay=true)void MyMethod();OperationContract void MyMethodslow();public class CalculatorService:IMyContract public vo

16、id MyMethod()Thread.Sleep(1000);/立即返回public void MyMethodslow()Thread.Sleep(1000);/等待十秒,单向操作是客户端调用操作并在WCF 将消息写入网络后继续进行处理的操作。通常,除非在出站消息中发送的数据极其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。此种类型的消息交换模式支持从客户端到服务应用程序的类似于事件的行为。若要为返回void 的操作指定单向消息交换,请将IsOneWay 属性设置为true,默认为false.,创建服务协定-服务操作的消息模式2,此方法与前面的请求/答复示例相同,但是,将IsOn

17、eWay属性设置为true 意味着尽管方法相同,服务操作也不会发送返回消息,而客户端将在出站消息抵达通道层时立即返回,创建服务协定-服务操作的消息模式2,双向模式下,客户端与服务端之间的数据交换是双向的,客户端既可以调用服务端的方法,服务端也可以反过来“回调(call back)”客户端的方法。因此,客户端在发出调用请必须准备好可供服务端“回调”的方法,这是双向模式的重要特征。,双向模式,由于客户端必须提供一个回调方法供服务端调用,因此,需要绑定支持数据的双向流动。双向模式只适用于三种类型的绑定:TCP、NamedPipe(命名管道)和WSDualHttpBinding。对于支持双向通讯的协议

18、,比如TCP和命名管道,只需复用原有的通道即可。HTTP协议本质上是一种无状态的“请求/响应”数据交换模式,不支持服务端回调客户端,为了实现双向模式,WCF创建了另一个回调通道以实现双向通讯,基类库中的WSDualHttpBinding实现了基于HTTP协议的双向模式。,双向模式使用的绑定,双工模式的特点:1.无论使用单向消息发送还是请求/答复消息发送方式,服务和客户端均能够独立地向对方发送消息。消息交换过程中,服务端和客户端角色会发生调换。2.服务端处理完请求后,返回给客户端的不是reply,而是callback请求。由于存在与客户端通信的附加机制,双向模式比请求/答复或单向模式要略为复杂若

19、要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的ServiceContractAttribute 属性(attribute)的CallbackContract 属性(property)。若要实现双工模式,必须创建第二个接口,该接口包含在客户端调用的方法声明。如果用“添加服务引用”生成客户端代理,代理定义的接口名称是有服务名后加“Callback”,客户端必须实现由此接口派生的类。,创建服务协定-服务操作的消息模式3,创建服务协定-服务操作的消息模式3,ServiceContract(Namespace=http:/CallbackContract=typeof(IC

20、allback)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=t

21、rue)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.将回调接口应用到服务契约上,将两个代码连接 Serv

22、iceContract(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

23、: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

24、(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类,该对象存储着服务的环境信息。InstanceC

25、ontext instanceContext=new InstanceContext(new ServiceClient())/回调服务,最好起名为Service1CallBackServiceReference2.IserviceClient proxy=new client.ServiceReference2.IserviceClient(instanceContext);,NetTcpBinding和NetNamedPipeBinding绑定支持回调操作;WSDualHttpBinding绑定是通过设置两个HTTP信道来支持双向通信,例子:,a.Service Request:客户端向服

26、务端发出调用,在调用的过程中会把回调实例的引用一起发送到服务端去。b.Callback Request:服务端从上一步的请求中取得对回调实例的引用,通过该回调实例向客户端发出的回调请求。c.Callback Response:客户端执行完回调后向服务端返回的响应,如果回调契约中的方法契约被定义为IsOneWay的话,这一步不会发生。d.Service Response:服务端方法执行完后向客户端返回信息(方法的返回值等)。,ServiceContract(CallbackContract=typeof(IWCFCallBack)public interface IWCFService Oper

27、ationContract 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(

28、);a.ServiceContract(CallbackContract=typeof(IWCFCallBack)把服务契约与回调契约联系起来b.ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant)这一句并不是非要加,如果回调契约中的方法契约是oneway操作时,则不需要加。c.IWCFCallBack callback=OperationContext.Current.GetCallbackChannel();当客户端向服务端发送请求的时候会把回调信息一起发送到服务端,在服务端可以通过上面的方法,在当前的操作上下文中获取当前操作

29、的客户端的回调通道,通过这个回调通道对象来调用客户端的回调方法。,1定义服务契约,public interface IWCFCallBack OperationContract(IsOneWay=true)void SayHelloCallBack();回调契约中的方法契约声明为单向操作契约OperationContract(IsOneWay=true),意味着服务端对客户端的回调只单向调用。这里的方法契约可以声明为单向操作也可不声明为单向操作,究竟是否需要设置为单向操作,要根据服务的并发状态来判断:如果服务并发状态是ConcurrencyMode.Reentrant,则回调方法契约不需要单向

30、操作,否则需要单向操作。,2定义回调契约,3托管服务(使用支持双工通信的绑定),在服务器端定义了回调契约,在生成代理类的时候,会在客户端生成对应的回调契约,但回调契约的名子发生了变化。客户端生成的回调契约并不与服务器端的回调契约一致,而是在服务端的服务契约之后加上CallBack来命名的,这是因为客户端的回调契约就是通过服务契约声明来取得的。,4客户端代理生成,class ClientCallBack:CallBackOP.IWCFServiceCallback public void SayHelloCallBack()Console.WriteLine(callback is writti

31、ng);,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)”对象,该对象中包含回调对象的实例,调用服务端方法的时候,实

32、例上下文被一起传递给服务端,这样服务端就知道了客户端回调对象的信息了。,6客户端调用,a.在客户端类中把代理类作为成员变量,在相应的方法中实例化代理类,通过代理调用服务。b.让当前类实现IDisposable接口,并在Dispose()方法中关闭代理。,另一种客户端方法,class Program:CallBackOP.IWCFServiceCallback,IDisposable private CallBackOP.WCFServiceClient prox=null;public void SayHelloCallBack()Console.WriteLine(callback is w

33、ritting);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来发现其他节点。,对等网络,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号