《《服务契约》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《服务契约》PPT课件.ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、南京工业职业技术学院蒋美云南京工业职业技术学院如何在WCF服务中设计服务契约了解常用的消息交换模式(MEP)掌握异步调用方法掌握双工通信南京工业职业技术学院服务契约服务契约是对服务端点之间传递消息的描述,是服务所实现的功能操作。将.NET类型中的类方法映射到WSDL中的服务、端口类型及操作。消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头。服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。终结点 终结点是用来发送或接收消息(或执行这两种操作)的构造。终结点包括一个定义消息可以发送到的目的地的位置(地址)、一个描述消息应如何发送的通信
2、机制规范(绑定)以及对于可以在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定)该定义还描述了可以发送何种消息。WCF 服务作为一个终结点集合向外界公开。南京工业职业技术学院南京工业职业技术学院服务契约描述了一个服务端点所实现的操作接口。服务契约将.net类型中的类方法映射到WSDL中的服务、端口类型及操作。服务契约中标有OperationContract的方法都将在WSDL中发布。-ServiceContractpublic interface IServiceOperationContractstring GetData(int value);OperationContractCo
3、mpositeType GetDataUsingDataContract(CompositeType composite);南京工业职业技术学院是一种XML格式,它将网络服务描述为一组端点,端点对包含有文档或过程相关信息的消息进行操作。操作与消息首先被抽象地定义,之后与实际网络协议及消息格式绑定,以定义端点。WSDL具备可扩展性,无论消息采用何种格式,或者网络以什么协议通信,都可以对端点与消息加以描述。契约是在WSDL和XSD(除CLR基类型外自定义的类型用XSD表示)定义,而代码通常使用CLR类型,如何映射?第一用ServiceContract、OperationContract、DataC
4、ontract等,第二是通过客户端代理将CLR与方法序列化为xml。南京工业职业技术学院在.NET端CLR类型定义了数据结构或功能,在XML端XSD定义了数据结构两者之间的映射工具:和添加服务引用当然服务端也有相应的工作,即用ServiceContract、OperationContract、DataContract等南京工业职业技术学院定义服务协定在类或接口上使用ServiceContractAttribute 属性标记定义服务操作在方法上使用OperationContractAttribute 属性对其进行标记(所有的方法都必须用该标记)参数和返回值 每个操作都有一个返回值和一个参数,即使
5、它们为void。参数或返回值中使用的每个类型都必须是可序列化的,换言之,该类型的对象必须能够转换为字节流,并能够从字节流转换为对象。默认情况下,CLR内建基元类型(编译器直接支持的数据类型称为基元类型)是可序列化的,.NET Framework 中的很多类型都是可序列化的。后面介绍序列化的相关知识南京工业职业技术学院 ServiceContract public interface IService OperationContract string Hello(string name);能够显式地指定Name,NameSpaceServiceContract(Name=ContentManag
6、erContract,Name=ContentManagerContract,Namespace=Namespace=http:/ http:/ interface IContentManagerService南京工业职业技术学院服务契约中的所有方法都应该拥有OperationContractAttributeOperationContractAttribute ServiceContract public interface IService OperationContract(Name=“Hello1”)string Hello(string name);能够显式地指定Name,Actio
7、n,ReplyAction(wsdl:input 和wsdl:output元素。这些元素的顺序 暗示了在一个响应消息发送以前,请求消息必须先被接收)南京工业职业技术学院使用MessageParameterAttributeMessageParameterAttribute来控制来控制参数或者返回名称ServiceContractpublic interface IContentManagerService OperationContract void SaveLink(MessageParameter(Name=LinkItem)MessageParameter(Name=LinkItem)(
8、LinkItem item);OperationContract return:MessageParameter(Name=LinkItem)return:MessageParameter(Name=LinkItem)LinkItem GetLink(string id);南京工业职业技术学院参考例子:ExplicitServiceContracts南京工业职业技术学院MEP:Message Exchange Pattern,消息交换模式。WCF服务端与客户端间的信息相换的过程类似于打电话。很明显,当一个人要和另一人进行电话联系时,他必须先拨号,等对方摘机接听,然后双方一问一答,最后两人先后挂
9、机,只有遵循这个流程,通话才能顺利进行。类似地,MEP就起到规定WCF服务端与客户端“通话”流程的作用。掌握常用的MEP编程方法,是进行WCF开发的基本要求。南京工业职业技术学院请求/响应模式:客户端发出请求,服务端响应,然后客户端再发出下一个请求,即“一问一答”。单向模式:客户端发出请求后不需要回应,客户端需要得到发送确认,即“发送确认模式”双向模式:客户端可以向服务端发出服务请求,服务端反过来也可以调用客户端的服务。事件发布与订阅模式:WCF服务端发布一个事件,多个客户端可以订阅这个事件。这是“双向模式”的变种。P2P模式:不区分客户端与服务端,或者说,所有的参与者既是客户端又是服务端。南
10、京工业职业技术学院请求/响应是WCF默认的MEP模式。使用这种模式时,客户方发出服务调用请求后,要等待服务端发回响应后,方法才返回。即使服务协定中的方法返回值类型为void,服务端仍将向客户端发出一个空的响应消息。客户端会在发出请求的线程上阻塞等待此消息。当发生通讯故障或超时时,客户端代理对象引发CommunicationException或TimeoutException。南京工业职业技术学院请求/答复看书p32u 通过请求/答复模式,请求发送方(客户端应用程序)将接收与请求相关的答复。它既支持传入操作(一个或多个参数传递到该操作中),也支持返回操作(该操作将一个或多个输出值传回给调用方)请
11、注意,除非指定其他基础消息模式,否则,即使服务操作返回void(在Visual Basic 中为Nothing),也属于请求/答复消息交换。操作的结果是:除非客户端异步调用操作,否则客户端将停止处理,直到收到返回消息,即使该消息正常情况下为空时也是如此。南京工业职业技术学院缺点 如果执行操作需要很长的时间,则会降低客户端性能和响应能力南京工业职业技术学院两种方式:同步调用(同前面的例题)异步调用,本章例题:异步加法clientbase客户端2,同WCF习题中:异步加法channelf方式比较异步调用做法:u使用.NET框架中异步编程模式为客户端引入异步行为,可以使对任何同步方法的调用以异步方式
12、进行u引入IAsyncResult类,并创建Begin*和End*方法。u客户端先调用Begin*,后继续执行当前线程中的方法,每调用一次Begin*,客户端稍后都要调用一次End*方法取得结果。u客户端传递一个代理给Begin*,在异步操作被调用时,代理也被调用,可以存储Begin*调用的状态。ServiceReference2.CalculateClient channel=new clientbase1.ServiceReference2.CalculateClient();IAsyncResult ar=channel.BeginAdd(1,2,Addcallback,channel)
13、;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.);,c
14、hannel);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方法调用结束后调用的一个本地方法,第四个参
15、数可以是任何对象,用于发起例程和AsyncCallback之间进行状态沟通南京工业职业技术学院客户端只管发出调用,不再理会此消息是否到达到服务端,也不要求服务端发回响应消息。在该模式下:u没有返回值,返回类型只能为void u不能包含ref或者out类型的参数 u只有客户端发起请求,服务端并不会对请求进行回复。u通过设置OperationContract的IsOneWay=True可以将满足要求的方法设置为这种消息交换模式:OperationContract(IsOneWay=true)IsOneWay=true)南京工业职业技术学院ServiceContractinterface IMyCo
16、ntract OperationContract(IsOneWay=true)IsOneWay=true)void MyMethod();OperationContract void MyMethodslow();public class CalculatorService:IMyContract public void MyMethod()Thread.Sleep(1000);/立即返回public void MyMethodslow()Thread.Sleep(1000);/等待十秒南京工业职业技术学院单向操作是客户端调用操作并在WCF 将消息写入网络后继续进行处理的操作。通常,除非在出站
17、消息中发送的数据极其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。此种类型的消息交换模式支持从客户端到服务应用程序的类似于事件的行为。若要为返回void 的操作指定单向消息交换,请将IsOneWay 属性设置为true,默认为false.南京工业职业技术学院此方法与前面的请求/答复示例相同,但是,将IsOneWay属性设置为true 意味着尽管方法相同,服务操作也不会发送返回消息,而客户端将在出站消息抵达通道层时立即返回南京工业职业技术学院双向模式下,客户端与服务端之间的数据交换是双向的,客户端既可以调用服务端的方法,服务端也可以反过来“回调(call back)”客户端的方法。因此
18、,客户端在发出调用请必须准备好可供服务端“回调”的方法,这是双向模式的重要特征。南京工业职业技术学院由于客户端必须提供一个回调方法供服务端调用,因此,需要绑定支持数据的双向流动。双向模式只适用于三种类型的绑定:TCP、NamedPipe(命名管道)和WSDualHttpBinding。对于支持双向通讯的协议,比如TCP和命名管道,只需复用原有的通道即可。HTTP协议本质上是一种无状态的“请求/响应”数据交换模式,不支持服务端回调客户端,为了实现双向模式,WCF创建了另一个回调通道以实现双向通讯,基类库中的WSDualHttpBinding实现了基于HTTP协议的双向模式。南京工业职业技术学院双
19、工模式的特点:u1.无论使用单向消息发送还是请求/答复消息发送方式,服务和客户端均能够独立地向对方发送消息。消息交换过程中,服务端和客户端角色会发生调换。u2.服务端处理完请求后,返回给客户端的不是reply,而是callback请求。由于存在与客户端通信的附加机制,双向模式比请求/答复或单向模式要略为复杂若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的ServiceContractAttribute 属性(attribute)的CallbackContract 属性(property)。若要实现双工模式,必须创建第二个接口,该接口包含在客户端调用的方法声明。如果
20、用“添加服务引用”生成客户端代理,代理定义的接口名称是有服务名后加“Callback”,客户端必须实现由此接口派生的类。南京工业职业技术学院 ServiceContract(Namespace=http:/ 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);南京工
21、业职业技术学院WcfServiceLibrary2双工南京工业职业技术学院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 resul
22、t);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(
23、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.Forma
24、t(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 Ge
25、tMinus(string result)Console.WriteLine(result);6.托管服务(使用支持双工通信的绑定)7.客户端代理生成,需要使用InstanceContext类,该对象存储着服务的环境信息。InstanceContext instanceContext=new InstanceContext(new ServiceClient())/回调服务,最好起名为Service1CallBackServiceReference2.IserviceClient proxy=new client.ServiceReference2.IserviceClient(instanc
26、eContext);南京工业职业技术学院NetTcpBindingNetTcpBinding和和NetNamedPipeBindingNetNamedPipeBinding绑定支定支持回持回调操作;操作;WSDualHttpBindingWSDualHttpBinding绑定是通定是通过设置置两个两个HTTPHTTP信道来支持双向通信信道来支持双向通信南京工业职业技术学院a.Service Requesta.Service Request:客户端向服务端发出调用,在调用的过程中会把回调实例的引用一起发送到服务端去。b.Callback Requestb.Callback Request:服务端
27、从上一步的请求中取得对回调实例的引用,通过该回调实例向客户端发出的回调请求。c.Callback Responsec.Callback Response:客户端执行完回调后向服务端返回的响应,如果回调契约中的方法契约被定义为IsOneWay的话,这一步不会发生。d.Service Responsed.Service Response:服务端方法执行完后向客户端返回信息(方法的返回值等)。南京工业职业技术学院ServiceContract(ServiceContract(CallbackContract=typeof(IWCFCallBack)CallbackContract=typeof(IW
28、CFCallBack)public interface IWCFService OperationContract OperationContract string SayHelloToUser();/ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant)/ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant)public class WCFService:IWCFService IWCFCallBack callback=IWCFCallBack callback=Op
29、erationContext.Current.GetCallbackChannelOperationContext.Current.GetCallbackChannel();();public string SayHelloToUser()callback.SayHelloCallBack();return WCF Service +DateTime.Now.ToString();a.ServiceContract(CallbackContract=typeof(IWCFCallBack)a.ServiceContract(CallbackContract=typeof(IWCFCallBac
30、k)把服把服务契契约与与回回调契契约联系起来系起来b.ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant)b.ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant)这一句并不是非要加,如果回一句并不是非要加,如果回调契契约中的方法契中的方法契约是是onewayoneway操作操作时,则不需要加。不需要加。c.IWCFCallBack callback=c.IWCFCallBack callback=OperationContext.Current.GetCallback
31、Channel();OperationContext.Current.GetCallbackChannel();当客当客户端向服端向服务端端发送送请求的求的时候会把回候会把回调信息一起信息一起发送到服送到服务端,在服端,在服务端可端可以通以通过上面的方法,在当前的操作上下文中上面的方法,在当前的操作上下文中获取当前操作的客取当前操作的客户端的回端的回调通道,通道,通通过这个回个回调通道通道对象来象来调用客用客户端的回端的回调方法。方法。南京工业职业技术学院public interface IWCFCallBackIWCFCallBack OperationContract(IsOneWay=t
32、rue)OperationContract(IsOneWay=true)void SayHelloCallBack();回调契约中的方法契约声明为单向操作契约OperationContract(IsOneWay=true),意味着服务端对客户端的回调只单向调用。这里的方法契约可以声明为单向操作也可不声明为单向操作,究竟是否需要设置为单向操作,要根据服务的并发状态来判断:如果服务并发状态是,则回调方法契约不需要单向操作,否则需要单向操作。南京工业职业技术学院南京工业职业技术学院在服在服务器端定器端定义了回了回调契契约,在生成代理在生成代理类的的时候,会在客候,会在客户端端生成生成对应的回的回调契
33、契约,但回,但回调契契约的名子的名子发生了生了变化。化。客客户端生成的回端生成的回调契契约并不与服并不与服务器端的回器端的回调契契约一致,而是在一致,而是在服服务端的服端的服务契契约之后加上之后加上CallBackCallBack来命名的来命名的,这是因为客户端的回调契约就是通过服务契约声明来取得的。南京工业职业技术学院class public void SayHelloCallBack()SayHelloCallBack()Console.WriteLine(callback is writting);南京工业职业技术学院ClientCallBack cc=new ClientCallBac
34、k();ClientCallBack cc=new ClientCallBack();InstanceContext context=new InstanceContext(cc);InstanceContext context=new InstanceContext(cc);CallBackOP.WCFServiceClient ws=new Client.CallBackOP.WCFServiceClient(contextcontext);ws.SayHelloToUser();ws.SayHelloToUser();Console.ReadLine();ws.Close();“实例上下
35、文(例上下文(InstanceContextInstanceContext)”对象象,该对象象中包含回中包含回调对象的象的实例,例,调用服用服务端方法的端方法的时候,候,实例上下文被一起例上下文被一起传递给服服务端,端,这样服服务端就知端就知道了客道了客户端回端回调对象的信息了。象的信息了。南京工业职业技术学院a.a.在客在客户端端类中把代理中把代理类作作为成成员变量,在相量,在相应的的方法中方法中实例化代理例化代理类,通,通过代理代理调用服用服务。b.b.让当前当前类实现IDisposableIDisposable接口,并在接口,并在Dispose()Dispose()方法中关方法中关闭代理
36、。代理。南京工业职业技术学院class Program:CallBackOP.IWCFServiceCallback,IDisposable Program:CallBackOP.IWCFServiceCallback,IDisposable private CallBackOP.WCFServiceClient prox=null;public void SayHelloCallBack()SayHelloCallBack()Console.WriteLine(callback is writting);public void CallService()InstanceContext con
37、text=new InstanceContext(this);InstanceContext context=new InstanceContext(this);prox=new Client.CallBackOP.WCFServiceClient(context);prox=new Client.CallBackOP.WCFServiceClient(context);string str=prox.SayHelloToUser();string str=prox.SayHelloToUser();Console.WriteLine(Client:+str);public void Dispose()Dispose()prox.Close();static void Main(string args)Program p=new Program();Program p=new Program();p.CallService();p.CallService();Console.ReadLine();南京工业职业技术学院南京工业职业技术学院在一个纯P2P应用程序中每个参与者对于网络中的其他参与者而言既是客户机又是服务器。P2P应用程序之间通过啮nie合网,啮合网事一组相互连接的对等节点。PNRP一个分布式名称解析协议,用PNRP来发现其他节点。
限制150内