幸运星空

Lucker的程序人生

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

服务协定(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而言,必须在方法中对其完成初始化。

 

<完>

posted on 2012-09-25 16:52  Lucker  阅读(329)  评论(0编辑  收藏  举报