2、WCF设计和实现服务协定

一、WCF服务术语

1、消息

  -消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头。

2、服务

  -服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。

3、终结点

  —终结点是用来发送或接受消息(或执行这两个操作)的构造,终结点包括一个定义消息可以发送到目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定)以及对于可以在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定)—该定义还描述了可以发送何种消息。

  —WCF服务作为一个终结点集合向外界公开。

二、创建服务协定

  1、类或接口都可以定义服务协定,建议使用接口,因为接口可以直接对服务协定建模。

  2、服务协定接口具有托管接口的所有优点:

    (1)、服务协定接口可以扩展任何数量的其他服务协定接口。

    (2)、一个类可以通过实现服务协定接口来实现任意数量的服务协定。

    (3)、可以通过更改接口实现来修改服务协定的实现,而让服务协定保持不变。

    (4)、可以通过实现旧接口和新接口来确定服务的版本。老客户端连接到原始版本,而新客户端则可以连接到较新的版本。

 

  3、定义服务协定

    在类或接口上使用ServiceContractAttribute 属性标记

  4、定义服务操作

    在方法上使用 OperationContractAttribute 属性对其进行标记

  5、参数和返回值(注意)

    每个操作都有一个返回值和一个参数,即使它们为 void。 可以使用局部方法将对对象的引用从一个对象传递到另一个对象,但与局部方法不同的是,服务操作不会传递对对象的引用, 它们传递的只是对象的副本。主要是wcf是在internet中的,不在一台电脑中,所以,传递的只是副本。

    这一点很重要,这是因为参数或返回值中使用的每个类型都必须是可序列化的,换言之,该类型的对象必须能够转换为字节流,并能够从字节流转换为对象。

    默认情况下,基元类型是可序列化的,.NET Framework 中的很多类型都是可序列化的。

  6、服务操作的消息模式

    —请求/回复模式

    —单向模式

    —双工模式

    (1)、请求/回复模式

      通过请求/答复模式,请求发送方(客户端应用程序)将接收与请求相关的答复。这是默认的模式,因为它既支持传入操作(一个或多个参数传递到该操作中),也支持返回操作(该操作将一个或多个输出值传回给调用方)。

        [OperationContract]
        string GetData(int value);

      请注意,除非指定其他基础消息模式,否则,即使服务操作返回string GetData(int Value);void(在Visual Basic 中为Nothing),也属于请求/答复消息交换。

      操作的结果是:除非客户端异步调用操作,否则客户端将停止处理,直到收到返回消息,即使该消息正常情况下为空时也是如此。

      请求/回复模式

      缺点:如果执行操作需要很长的时间,则会降低客户端性能和响应能力

      优点:响应消息中可返回 SOAP 错误,这表明可能在通信或处理中发生了一些与服务有关的错误状况

    (2)、单向模式

      如果WCF 服务应用程序的客户端不必等待操作完成,并且不处理SOAP 错误,则该操作可以指定单向消息模式。

      单向操作是客户端调用操作并在 WCF 将消息写入网络后继续进行处理的操作。通常这意味着,除非在出站消息中发送的数据极其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。此种类型的消息交换模式支持从客户端到服务应用程序的类似于事件的行为。

      若要为返回void 的操作指定单向消息交换,请将IsOneWay 属性设置为true,默认为false.

        [OperationContract(IsOneWay=true)]
        string GetData(int value);

      此方法与前面的请求/答复示例相同,但是,将IsOneWay属性设置为 true 意味着尽管方法相同,服务操作也不会发送返回消息,而客户端将在出站消息抵达通道层时立即返回。

    (3)、双工模式

      双工模式的特点是,无论使用单向消息发送还是请求/答复消息发送方式,服务和客户端均能够独立地向对方发送消息。对于必须直接与客户端通信或向消息交换的任意一方提供异步体验(包括类似于事件的行为)的服务来说,这种双向通信形式非常有用。

      由于存在与客户端通信的附加机制,双向模式比请求/答复或单向模式要略为复杂

      若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的ServiceContractAttribute 属性(attribute)的CallbackContract 属性(property)。

      若要实现双工模式,您必须创建第二个接口,该接口包含在客户端调用的方法声明

    

ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples",
SessionMode=SessionMode.Required,
CallbackContract=typeof(ICalculatorDuplexCallback))]
public interface ICalculatorDuplex
{
  [OperationContract(IsOneWay = true)]
  void Clear();
}
public interface ICalculatorDuplexCallback
{
  [OperationContract(IsOneWay = true)]
  void Equals(double result);
  [OperationContract(IsOneWay = true)]
  void Equation(string eqn);
}

 

posted @ 2013-08-03 21:02  柏拉图的永恒  阅读(150)  评论(0编辑  收藏  举报