服务协定(ServiceContract)
首先明白几个术语:
消息:独立的数据单元,包括正文和消息头。
终结点:用于发送或接收消息的构造。一个WCF服务作为一个终结点向外界公开。
服务:服务是一个公开了一个或多个终结点的构造,包括一个或多个服务操作。
创建服务协定:
可以用类和接口来定义,不过推荐使用接口来建模,这是因为接口定义的服务协定可以方便的进行其它服务协定的扩展,也方便实现类实现其它服务协定,便于修改和版本更新。
定义服务协定:使用ServiceContractAttribute属性标记。
定义服务操作:使用OperationContractAttribute属性标记。
参数与返回值:每个操作都有一个返回值与一个参数,即使是void。它们在Client和Server之间传递的是对象的副本而不是对象的引用,且必须是可序列化的。
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] // 服务合约 public interface ICalculator { [OperationContract] // 操作合约 double Add(double n1, double n2); [OperationContract] // 操作合约 double Subtract(double n1, double n2); [OperationContract] // 操作合约 double Multiply(double n1, double n2); [OperationContract] // 操作合约 double Divide(double n1, double n2); }
服务操作的三种消息模式:
1,请求/答复模式(默认模式),支持传入操作和返回操作。如果客户端采用同步调用模式的话,将梗塞直到服务返回。
[OperationContract] string GetData(string para);
2,单向模式,客户端不等待操作的完成也不处理SOAP错误信息。一般用于返回void的操作指定为单向模式。
[OperationContract(IsOneWay=true)] Hello(string para);
3,双工模式,当必须直接与对方通讯时,可以设计回调协定,实现双工模式,这时双方都可以独立的向对方发送信息。
[ServiceContract(NameSpace=”http://Microsoft.ServiceModel.Samples”, SessionMode=SessionMode.Required, CallbackContract=typeof(ICalculatorDuplexCallback))]//回调协定必须是事先指定类型的对象 public interface ICalculatorDuplex{ [OperationContract(IsOneWay=true)] Clear(); [OperationContract(IsOneWay=true)] Add(int para); } public interface ICalculatorDuplexCallback{ [OperationContract(IsOneWay=true)] void Equals(double result); [OperationContract(IsOneWay=true)] void Equaltion(string eqn); }
实现接口服务协定时的方法:
ICalculatorDuplexCallback callback = OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
这样就获得了对方回调时的对象的副本,就可以方便的通过callback来调用该接口内的方法了,注意,这里面方面的实现是在对方而不是本地。
当客户端调用服务端的Add方法时,可以在Add方法中回调客户端实现的ICalculatorDuplexCallback子类中的相关方法,从而实现双方都可以调用对方的类与方法。
Out与Ref参数:这两种参数不可用于单向模式。使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
<完>
※※※※※※※※※※※※※※--我的程序人生--※※※※※※※※※※※※※※