服务契约PPT课件

上传人:大米 文档编号:567528358 上传时间:2024-07-21 格式:PPT 页数:45 大小:3.38MB
返回 下载 相关 举报
服务契约PPT课件_第1页
第1页 / 共45页
服务契约PPT课件_第2页
第2页 / 共45页
服务契约PPT课件_第3页
第3页 / 共45页
服务契约PPT课件_第4页
第4页 / 共45页
服务契约PPT课件_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《服务契约PPT课件》由会员分享,可在线阅读,更多相关《服务契约PPT课件(45页珍藏版)》请在金锄头文库上搜索。

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

2、目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定)以及对于可以在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定) 该定义还描述了可以发送何种消息。 WCF 服务作为一个终结点集合向外界公开。创建服务协定创建服务协定WCFWCF术语术语南京工业职业技术学院SOASOA体系结构体系结构南京工业职业技术学院服务契约描述了一个服务端点所实现的操作接口。服务契约将.net类型中的类方法映射到WSDL中的服务、端口类型及操作。服务契约中标有OperationContract的方法都将在WSDL中发布。服务契约服务契约- - ServiceContractpublic interf

3、ace IServiceOperationContractstring GetData(int value);OperationContractCompositeType GetDataUsingDataContract(CompositeType composite);南京工业职业技术学院是一种XML格式,它将网络服务描述为一组端点,端点对包含有文档或过程相关信息的消息进行操作。操作与消息首先被抽象地定义,之后与实际网络协议及消息格式绑定,以定义端点。WSDL具备可扩展性,无论消息采用何种格式,或者网络以什么协议通信,都可以对端点与消息加以描述。契约是在WSDL和XSD(除CLR基类型外自定

4、义的类型用XSD表示)定义,而代码通常使用CLR类型,如何映射?第一用ServiceContract、OperationContract、DataContract等,第二是通过客户端代理将CLR与方法序列化为xml。WSDLWSDL南京工业职业技术学院在.NET端CLR类型定义了数据结构或功能,在XML端XSD定义了数据结构两者之间的映射工具:SvcUtil.exe和添加服务引用当然服务端也有相应的工作,即用ServiceContract、OperationContract、DataContract等南京工业职业技术学院定义服务协定在类或接口上使用ServiceContractAttribut

5、e 属性标记定义服务操作在方法上使用OperationContractAttribute 属性对其进行标记(所有的方法都必须用该标记)参数和返回值 每个操作都有一个返回值和一个参数,即使它们为void。参数或返回值中使用的每个类型都必须是可序列化的,换言之,该类型的对象必须能够转换为字节流,并能够从字节流转换为对象。 默认情况下,CLR内建基元类型(编译器直接支持的数据类型称为基元类型)是可序列化的,.NET Framework 中的很多类型都是可序列化的。后面介绍序列化的相关知识创建服务协定创建服务协定南京工业职业技术学院 ServiceContract public interface I

6、Service OperationContract string Hello(string name ); 能够显式地指定Name,NameSpaceServiceContract(Name=ContentManagerContract,Name=ContentManagerContract,Namespace=Namespace=http:/ http:/ /samples/2007/07)/samples/2007/07)public interface IContentManagerServiceServiceContractAttributeServiceContractAttribu

7、te南京工业职业技术学院服务契约中的所有方法都应该拥有OperationContractAttributeOperationContractAttribute ServiceContract public interface IService OperationContract (Name=“Hello1”) string Hello(string name ); 能够显式地指定Name, Action, ReplyAction( wsdl:input 和wsdl:output元素。这些元素的顺序 暗示了在一个响应消息发送以前,请求消息必须先被接收)OperationContractAttri

8、buteOperationContractAttribute南京工业职业技术学院使用MessageParameterAttributeMessageParameterAttribute来控制来控制参数或者返回名称ServiceContractpublic interface IContentManagerService OperationContract void SaveLink(MessageParameter(Name=LinkItem)MessageParameter(Name=LinkItem) (LinkItem item); OperationContract return: M

9、essageParameter(Name=LinkItem) return: MessageParameter(Name=LinkItem) LinkItem GetLink(string id);MessageParameterAttributeMessageParameterAttribute南京工业职业技术学院demodemo参考例子:ExplicitServiceContracts南京工业职业技术学院MEP:Message Exchange Pattern,消息交换模式。WCF服务端与客户端间的信息相换的过程类似于打电话。很明显,当一个人要和另一人进行电话联系时,他必须先拨号,等对方摘

10、机接听,然后双方一问一答,最后两人先后挂机,只有遵循这个流程,通话才能顺利进行。类似地,MEP就起到规定WCF服务端与客户端“通话”流程的作用。掌握常用的MEP编程方法,是进行WCF开发的基本要求。什么是什么是MEP?MEP?南京工业职业技术学院请求/响应模式:客户端发出请求,服务端响应,然后客户端再发出下一个请求,即“一问一答”。单向模式:客户端发出请求后不需要回应,客户端需要得到发送确认,即“发送确认模式”双向模式:客户端可以向服务端发出服务请求,服务端反过来也可以调用客户端的服务。事件发布与订阅模式:WCF服务端发布一个事件,多个客户端可以订阅这个事件。这是“双向模式”的变种。P2P模式

11、:不区分客户端与服务端,或者说,所有的参与者既是客户端又是服务端。MEPMEP种类种类南京工业职业技术学院请求/响应是WCF默认的MEP模式。使用这种模式时,客户方发出服务调用请求后,要等待服务端发回响应后,方法才返回。即使服务协定中的方法返回值类型为void,服务端仍将向客户端发出一个空的响应消息。客户端会在发出请求的线程上阻塞等待此消息。当发生通讯故障或超时时,客户端代理对象引发CommunicationException或TimeoutException。请求请求/ /响应模式响应模式南京工业职业技术学院请求/答复看书p32u 通过请求/答复模式,请求发送方(客户端应用程序)将接收与请求

12、相关的答复。它既支持传入操作(一个或多个参数传递到该操作中),也支持返回操作(该操作将一个或多个输出值传回给调用方)创建服务协定创建服务协定- -服务操作的消息模式服务操作的消息模式1 1 请注意,除非指定其他基础消息模式,否则,即使服务操作返回void(在Visual Basic 中为Nothing),也属于请求/答复消息交换。 操作的结果是:除非客户端异步调用操作,否则客户端将停止处理,直到收到返回消息,即使该消息正常情况下为空时也是如此。南京工业职业技术学院缺点 如果执行操作需要很长的时间,则会降低客户端性能和响应能力创建服务协定创建服务协定- -服务操作的消息模式服务操作的消息模式1

13、1南京工业职业技术学院两种方式:同步调用(同前面的例题)异步调用,本章例题:异步加法clientbase客户端2,同WCF习题中:异步加法channelf方式比较异步调用做法:u使用.NET框架中异步编程模式为客户端引入异步行为,可以使对任何同步方法的调用以异步方式进行u引入IAsyncResult类,并创建Begin*和End*方法。u客户端先调用Begin*,后继续执行当前线程中的方法,每调用一次Begin*,客户端稍后都要调用一次End*方法取得结果。u客户端传递一个代理给Begin*,在异步操作被调用时,代理也被调用,可以存储Begin*调用的状态。ServiceReference2.

14、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=(serviceC

15、lient)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,

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

17、型只能为void u不能包含ref或者out类型的参数 u只有客户端发起请求,服务端并不会对请求进行回复。 u通过设置OperationContract的IsOneWay=True可以将满足要求的方法设置为这种消息交换模式:OperationContract(IsOneWay= true)IsOneWay= true)单向模式单向模式南京工业职业技术学院ServiceContractinterface IMyContract OperationContract(IsOneWay= true)IsOneWay= true) void MyMethod( ); OperationContract

18、void MyMethodslow( ); public class CalculatorService: IMyContract public void MyMethod() Thread.Sleep(1000); /立即返回public void MyMethodslow() Thread.Sleep(1000); /等待十秒南京工业职业技术学院单向操作是客户端调用操作并在WCF 将消息写入网络后继续进行处理的操作。通常,除非在出站消息中发送的数据极其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。此种类型的消息交换模式支持从客户端到服务应用程序的类似于事件的行为。若要为返回voi

19、d 的操作指定单向消息交换,请将IsOneWay 属性设置为true,默认为false.创建服务协定创建服务协定- -服务操作的消息模式服务操作的消息模式2 2南京工业职业技术学院此方法与前面的请求/答复示例相同,但是,将IsOneWay属性设置为true 意味着尽管方法相同,服务操作也不会发送返回消息,而客户端将在出站消息抵达通道层时立即返回创建服务协定创建服务协定- -服务操作的消息模式服务操作的消息模式2 2南京工业职业技术学院双向模式下,客户端与服务端之间的数据交换是双向的,客户端既可以调用服务端的方法,服务端也可以反过来“回调(call back)”客户端的方法。因此,客户端在发出调

20、用请必须准备好可供服务端“回调”的方法,这是双向模式的重要特征。双向模式双向模式南京工业职业技术学院由于客户端必须提供一个回调方法供服务端调用,因此,需要绑定支持数据的双向流动。双向模式只适用于三种类型的绑定:TCP、NamedPipe(命名管道)和WSDualHttpBinding。对于支持双向通讯的协议,比如TCP和命名管道,只需复用原有的通道即可。HTTP协议本质上是一种无状态的“请求/响应”数据交换模式,不支持服务端回调客户端,为了实现双向模式,WCF创建了另一个回调通道以实现双向通讯,基类库中的WSDualHttpBinding实现了基于HTTP协议的双向模式。双向模式使用的绑定双向

21、模式使用的绑定南京工业职业技术学院双工模式的特点:u1.无论使用单向消息发送还是请求/答复消息发送方式,服务和客户端均能够独立地向对方发送消息。消息交换过程中,服务端和客户端角色会发生调换。u2.服务端处理完请求后,返回给客户端的不是reply,而是callback请求。由于存在与客户端通信的附加机制,双向模式比请求/答复或单向模式要略为复杂若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的ServiceContractAttribute 属性(attribute)的CallbackContract 属性(property)。若要实现双工模式,必须创建第二个接口,该

22、接口包含在客户端调用的方法声明。如果用“添加服务引用”生成客户端代理,代理定义的接口名称是有服务名后加“Callback”,客户端必须实现由此接口派生的类。创建服务协定创建服务协定- -服务操作的消息模式服务操作的消息模式3 3南京工业职业技术学院创建服务协定创建服务协定- -服务操作的消息模式服务操作的消息模式3 3 ServiceContract(Namespace=http:/ CallbackContract=typeof(ICallback) public interface ICalculator OperationContract(IsOneWay=true) void Add(

23、double x, double y); public interface ICallback OperationContract(IsOneWay = true) void DisplayResult(double x, double y, double result); 南京工业职业技术学院WcfServiceLibrary2双工domedome南京工业职业技术学院1.定义服务方契约 public interface IService1 OperationContract(IsOneWay = true) void Add(double a, double b); OperationCon

24、tract(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(Sessi

25、onMode = 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 S

26、ervice1 : 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

27、) 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

28、.客户端代理生成,需要使用InstanceContext类,该对象存储着服务的环境信息。InstanceContext instanceContext = new InstanceContext(new ServiceClient())/回调服务,最好起名为Service1CallBackServiceReference2.IserviceClient proxy = new client.ServiceReference2.IserviceClient(instanceContext);南京工业职业技术学院NetTcpBindingNetTcpBinding和和NetNamedPipeBin

29、dingNetNamedPipeBinding绑定支绑定支持回调操作;持回调操作;WSDualHttpBindingWSDualHttpBinding绑定是通过设置绑定是通过设置两个两个HTTPHTTP信道来支持双向通信信道来支持双向通信例子:例子:南京工业职业技术学院a.Service Requesta.Service Request:客户端向服务端发出调用,在调用的过程中会把回调实例的引用一起发送到服务端去。b.Callback Requestb.Callback Request:服务端从上一步的请求中取得对回调实例的引用,通过该回调实例向客户端发出的回调请求。c.Callback Res

30、ponsec.Callback Response:客户端执行完回调后向服务端返回的响应,如果回调契约中的方法契约被定义为IsOneWay的话,这一步不会发生。d.Service Responsed.Service Response:服务端方法执行完后向客户端返回信息(方法的返回值等)。南京工业职业技术学院ServiceContract(ServiceContract(CallbackContract=typeof(IWCFCallBack)CallbackContract=typeof(IWCFCallBack) public interface IWCFService OperationCo

31、ntract OperationContract string SayHelloToUser();/ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)/ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)public class WCFService : IWCFService IWCFCallBack callback = OperationContext.Current.GetCallbackChannelIWCFCallBack callback =

32、OperationContext.Current.GetCallbackChannel();(); public string SayHelloToUser() callback.SayHelloCallBack(); return WCF Service + DateTime.Now.ToString(); a.ServiceContract(CallbackContract=typeof(IWCFCallBack)a.ServiceContract(CallbackContract=typeof(IWCFCallBack)把服务契约与回调契约联系起来把服务契约与回调契约联系起来b.Serv

33、iceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)b.ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)这一句并不是非要加,如果回调契约中的方法契这一句并不是非要加,如果回调契约中的方法契约是约是onewayoneway操作时,则不需要加。操作时,则不需要加。c.IWCFCallBack callback = OperationContext.Current.GetCallbackChannel();c.IWCFCallBack callback = Operat

34、ionContext.Current.GetCallbackChannel();当客户端向服务端发送请求的时候会把回调信息一起发送到服务端,在服务端可以通过上面的方法,在当前的操作上下文中当客户端向服务端发送请求的时候会把回调信息一起发送到服务端,在服务端可以通过上面的方法,在当前的操作上下文中获取当前操作的客户端的回调通道,通过这个回调通道对象来调用客户端的回调方法。获取当前操作的客户端的回调通道,通过这个回调通道对象来调用客户端的回调方法。1 1定义服务契约定义服务契约南京工业职业技术学院public interface IWCFCallBackIWCFCallBack Operation

35、Contract(IsOneWay=true) OperationContract(IsOneWay=true) void SayHelloCallBack();回调契约中的方法契约声明为单向操作契约OperationContract(IsOneWay=true),意味着服务端对客户端的回调只单向调用。这里的方法契约可以声明为单向操作也可不声明为单向操作,究竟是否需要设置为单向操作,要根据服务的并发状态来判断:如果服务并发状态是ConcurrencyMode.Reentrant,则回调方法契约不需要单向操作,否则需要单向操作。2 2定义回调契约定义回调契约南京工业职业技术学院3 3托管服务(使

36、用支持双工通信的绑定)托管服务(使用支持双工通信的绑定)南京工业职业技术学院在服务器端定义了回调契约在服务器端定义了回调契约,在生成代理类的时候,会在客户端在生成代理类的时候,会在客户端生成对应的回调契约,但回调契约的名子发生了变化。生成对应的回调契约,但回调契约的名子发生了变化。客户端生成的回调契约并不与服务器端的回调契约一致,而是在客户端生成的回调契约并不与服务器端的回调契约一致,而是在服务端的服务契约之后加上服务端的服务契约之后加上CallBackCallBack来命名的来命名的,这是因为客户端的回调契约就是通过服务契约声明来取得的。4 4客户端代理生成客户端代理生成客户端代理生成客户端

37、代理生成南京工业职业技术学院class ClientCallBack : ClientCallBack : CallBackOP.IWCFServiceCallbackCallBackOP.IWCFServiceCallback public void SayHelloCallBack()SayHelloCallBack() Console.WriteLine(callback is writting); 5 5根据变化实现客户端回调契约根据变化实现客户端回调契约(客户(客户端定义回调契约)端定义回调契约)南京工业职业技术学院ClientCallBack cc = new ClientCall

38、Back();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.Cl

39、ose();“实例上下文(实例上下文(InstanceContextInstanceContext)”对象对象,该对该对象中包含回调对象的实例,调用服务端方法的时候,象中包含回调对象的实例,调用服务端方法的时候,实例上下文被一起传递给服务端,这样服务端就知实例上下文被一起传递给服务端,这样服务端就知道了客户端回调对象的信息了。道了客户端回调对象的信息了。6 6客户端调用客户端调用南京工业职业技术学院a.a.在客户端类中把代理类作为成员变量,在相应的在客户端类中把代理类作为成员变量,在相应的方法中实例化代理类,通过代理调用服务。方法中实例化代理类,通过代理调用服务。b.b.让当前类实现让当前类实

40、现IDisposableIDisposable接口,并在接口,并在Dispose()Dispose()方法中关闭代理。方法中关闭代理。另一种客户端方法另一种客户端方法南京工业职业技术学院class Program : CallBackOP.IWCFServiceCallback,IDisposable Program : CallBackOP.IWCFServiceCallback,IDisposable private CallBackOP.WCFServiceClient prox = null; public void SayHelloCallBack()SayHelloCallBack

41、() Console.WriteLine(callback is writting); public void CallService() InstanceContext context = new InstanceContext(this);InstanceContext context = new InstanceContext(this); prox = new Client.CallBackOP.WCFServiceClient(context); prox = new Client.CallBackOP.WCFServiceClient(context); string str =

42、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来发现其他节点。对等网络对等网络

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号