zoukankan      html  css  js  c++  java
  • 跟我一起从零开始学WCF系列课程笔记(2):设计和实现服务协定

    前言  WCF术语
    消息:消息是一个独立的数据单元,它可能由几个部分组成,包括消息的正文和消息头。
    服务:服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。
    终结点:终结点是用来发送或接受消息(或执行这两种操作)的构造。终结点包括一个定义消息可以发送到目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定)以及对于可以在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定)-----该定义还描述了可以发送何种消息。

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

    一、创建服务协定
    类或接口都可以定义服务协定,建议使用接口,因为接口可以直接对服务协定建模。
    服务协定接口具有托管接口的所有优点:
    ---服务协定接口可以扩展任何数量的其他服务协定接口。
    ---一个类可以通过实现服务协定接口来实现任意数量的服务协定。
    ---可以通过更改接口实现来修改服务协定的实现,而让服务协定保持不变。
    ---可以通过实现旧接口和新接口来确定服务的版本。老客户端连接到原始版本,而新客户端则可以连接到较新的版本。

    定义服务协定
    ---在类或接口上使用ServiceContractAttribute属性标记
    定义服务操作
    ---在方法上使用OperationContractAttribute属性对其进行标记(如果不用的话,就是这个方法不被客户端所公开)
    参数和返回值
    ---每个操作都有一个返回值和一个参数,即使它们为void。可以使用局部方法将对对象的引用从一个对象传递到另一个对象,但与局部方法不同的是,服务操作不会传递对对象的引用,它们传递的只是对象的副本。
    ---这一点很重要,这是因为参数或返回值中使用的每个类型都必须是可序列化的,换言之,该类型的对象必须能够转换为字节流,并能够从字节流转换为对象。
    ---默认情况下,基元类型(就是.NET的基本类型,比如int)是可序列化的,.NET Framework中的很多类型都是可序列化的。

    二、服务操作的消息模式(有三种方式)

    服务操作的消息模式1:请求/答复 (默认的模式)
    ---通过请求/答复模式,请求发送方(客户端应用程序)将接受与请求相关的答复。这是默认的模式,因为它既支持传入操作(一个或多个参数传递到该操作中),也支持返回操作(该操作将一个或多个输出值传回给调用方)
    [OperationContract]
    string Hello(string greeting);
    ---请注意,除非指定其他基础消息模式,否则,即使服务操作返回void(在VB中为Nothing),也属于请求/答复消息交换。
    ---操作的结果是:除非客户端异步调用操作,否则客户端将停止处理,直到收到返回消息,即使该消息正常情况下为空时也是如此。
    ---缺点:如果执行操作需要很长的时间,这会降低客户端性能和响应能力
    ---优点:响应消息中可返回SOAP错误,这表明可能在通信或处理中发生了一些与服务有关的错误状况

    服务操作的消息模式2:单向
    ---如果WCF服务应用程序的客户端不必等待操作完成,并且不处理SOAP错误,则该操作可以指定单向消息模式。
    ---单向操作是客户端调用操作并在WCF将消息写入网络后继续进行处理的操作。通常这意味着,除非在出站消息中发送的数据极其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。此种类型的消息交换模式支持从客户端到服务应用程序的类似于事件的行为。
    ---若要为返回void的操作指定单向消息交换,请将IsOneWay属性设置为true,默认为false。

    [OperationContract(IsOneWay=true)]
    void Hello(string greeting);

    服务操作的消息模式3:双工
    ---双工模式的特点是,无论使用单向消息发送还是请求/答复消息发送方式,服务和客户端均能够独立的向对方发送消息。对于必须直接与客户端通信或向消息交换的任意一方提供异步体验(包括类似于事件的行为)的服务来说,这种双向通信形式非常有用
    ---由于存在与客户端通信的附加机制,双向模式比请求/答复或单向模式要略为复杂。
    ---若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务的ServiceContractAttribute属性(attribute)的CallbackContract属性(property)
    ---若要实现双工模式,必须创建第二个接口,该接口包含在客户端调用的方法声明。

    三、创建数据协定
    ---面向服务的应用程序(例如WCF应用程序)设计为与Microsoft平台和非Microsoft平台上的最大可能数量的客户端应用程序进行互操作。
    ---为了获得最大可能的互操作性,建议您使用DataContractAttribute和DataMemberAttribute属性对您的类型进行标记,以创建数据协定。
    ---数据协定是服务协定的一部分,用于描述您的服务操作交换的数据。

        [DataContract]
        public class CompositeType
        {
            bool boolValue = true;
            string stringValue = "Hello ";
    
            [DataMember]
            public bool BoolValue
            {
                get { return boolValue; }
                set { boolValue = value; }
            }
    
            [DataMember]
            public string StringValue
            {
                get { return stringValue; }
                set { stringValue = value; }
            }
        }

    ---数据协定是可选的样式协定:除非您显式应用数据协定属性,否则不会序列化任何类型或数据成员(这里指的是自定义类型,而.NET的基本类型都是可序列化的)
    ---数据协定与托管代码的访问范围无关:可以对私有数据成员进行序列化,并将其发送到其他位置,以便可以公开访问它们
    ---WCF处理用于启用操作功能的基础SOAP消息的定义,并处理数据类型到消息正文的序列化和从消息正文进行的反序列化。数据类型一旦序列化,您就无需在设计操作时考虑基础消息交换基础结构(想要了解的话,可以去研究研究WCF底层框架)
    ---可以使用其他序列化机制。标准ISerializable,SerializableAttribute和IXmlSerializable机制都可用于处理数据类型到基础SOAP消息的序列化,这些消息可将数据类型从一个应用程序带到另一个应用程序。


    四、Out和Ref参数
    ---使用Out或Ref参数要求操作具有基础响应消息,才可以将已修改的对象传回。如果操作是单向操作,则将在运行时引发InvalidOperationException异常。

    所有例子的代码下载



     

  • 相关阅读:
    禁止logback输出状态信息
    Idea导出可运行Jar包
    K均值算法
    [转]香农信息论与毒药称球问题
    ajax跨域请求
    Python函数的静态变量
    学倦乱语
    [转]被当做狗和鸡来驱赶的百姓
    numpy文件读写的三对函数
    认真把事办砸是一种能力
  • 原文地址:https://www.cnblogs.com/EricaMIN1987_IT/p/2034531.html
Copyright © 2011-2022 走看看