• [MSDN]WCF(2)设计和实现服务协定


    说明:本内容来自微软的webcast,讲师为徐长龙。为了用手机阅读方便点,抄录存为txt。

    本次课程内容包括
    • 创建服务协定
    • 数据协定
    • Out和Ref参数

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

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

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


    创建服务协定-服务操作的消息模式1
    • 请求/答复
    – 通过请求/答复模式,请求发送方(客户端应用程序)将接收与请
    求相关的答复。这是默认的模式,因为它既支持传入操作(一个
    或多个参数传递到该操作中),也支持返回操作(该操作将一个
    或多个输出值传回给调用方)
    [OperationContract]
    – 请注意,除非指定其他基础消息模式,否则,即使服务操作返回
    string Hello(string greeting);
    void(在Visual Basic 中为Nothing),也属于请求/答复消息交
    换。
    – 操作的结果是:除非客户端异步调用操作,否则客户端将停止处
    理,直到收到返回消息,即使该消息正常情况下为空时也是如此。


    创建服务协定-服务操作的消息模式1
    • 缺点
    – 如果执行操作需要很长的时间,则会降低客户端性能和响应能力
    • 优点
    – 响应消息中可返回SOAP 错误,这表明可能在通信或处理中发生
    了一些与服务有关的错误状况


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


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


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


    创建服务协定-服务操作的消息模式3
    [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);
    }


    == 演示1 ==
    创建数据协定
    • 面向服务的应用程序(例如Windows Communication Foundation
    (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; }
    }
    }


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


    == 演示2 ==
    创建数据协定

    Out和Ref参数
    • 大部分情况下,您可以使用in 参数(Visual Basic 中为ByVal)、
    out 和 ref 参数(Visual Basic 中为 ByRef)。由于out 和 ref 参数都
    指示数据是从操作返回的,类似如下的操作签名会指定需要请求/答复
    操作,即使操作签名返回void 也是如此
    [ServiceContract]
    public interface IMyContract
    {
    [OperationContract]
    void PopulateData(ref CustomDataType data);
    }
    使数作有响才将• 用out 或ref 参要求操具基础应消息,可以已修
    改的
    对象传回。如果操作是单向操作,则将在运行时引发
    InvalidOperationException 异常


    == 演示3 ==
    Out 和Ref 参数

    小结
    • 创建服务协定
    • 数据协定
    • Out和Ref参数


     

  • 相关阅读:
    今天开始学习WCF了开发环境的配置
    我的文章《DLL封装登录框架实现代码复用》终于要发表了
    python小练习给右键菜单添加用chrome打开
    手动创建oracle数据库
    Sublime Text 2中如何输入中文
    转 用Python画Mandelbrot集
    Win7 64位安装Python PIL库
    推荐一本有关设计的好书《写给大家看的设计书》
    坚持做自己
    更新专业版显卡驱动导致ubuntu无法进入桌面环境
  • 原文地址:https://www.cnblogs.com/htht66/p/2328847.html
Copyright © 2020-2023  润新知