通常定义消息的架构,使用数据协定就够了,但是有时必须将类型精确映射到soap消息,方法两种:1、插入自定义soap标头;2、另一种是定义消息的头和正文的安全属性。消息协定通过MessageContract,成员通过MessageHeader和MessageBodyMember来设定。

消息的操作最多具有一个参数和返回值,且参数和返回值都必须是消息类型。如:

[OperationContract]
MessageContrctObject GetInfo(MessageContrctObject mco);
[OperationContract]
void SendInfo(MessageContrctObject mco);
......

//下面的是错误的
[OperationContract]
int GetInfo(MessageContrctObject mco);
[OperationContract]
void SendInfo(MessageContrctObject mco1,MessageContrctObject mco2);
......

跟前面写过的协定一样,只要应用了MessageContract、MessageHeader和MessageBodyMember,类,方法,字段或属性等等都将忽略修饰,对客户端来讲都是public的。

对于数组的定义有两种:一是直接用MessageHeader,二是用MessageHeaderArray,如下是我写的一个简单的例子:

[MessageContract]
    public class UserMessageArray
    {
        [MessageHeaderArray]
        public string[] NameList;

        [MessageBodyMember]
        public string Remark;
    }

    [MessageContract]
    public class UserMessage
    {
        [MessageHeader]
        public string[] NameList;

        [MessageBodyMember]
        public string Remark;

他们的序列化不同之处在于包节点。

对消息加密和签名,是通过MessageHeader和MessageBodyMember的ProtectionLevel,其值为枚举:None,Sign,EncryptAndSign,这个先简单说到这儿,以后再做详细介绍。

控制是否包装soap的正文部分可以通过MessageContract的IsWrapped进行设置,soap的标头通过Actor/Role(1.1为Actor,1.2为Role)给标头添加统一资源标识符,通过MustUnderstand指示处理标头的节点是否必须劣迹该标头,Relay指定要将标头中继到下游节点。WCF不会对soap消息做任何处理(MustUnderstand除外)。消息的Body中也有Order排序,但是基类不排在派生类之前。

在消息中,为了提升性能,建议每个消息中只包含一个标头和和正文,因为每个消息头和正文都是独立的进行序列化。

WCF基础之消息协定的更多相关文章

  1. WCF基础之数据协定

    数据协定最重要的当然就是DataContract和DataMember.这两个特性能应用到类.结构和枚举.这个两个特性跟服务契约的特点是一样的,只有被DataContract标记的类和类中被标记Dat ...

  2. WCF初探-19:WCF消息协定

    WCF消息协定概述 在生成 WCF应用程序时,开发人员通常会密切关注数据结构和序列化问题,而不必关心携带数据的消息结构. 对于这些应用程序,为参数或返回值创建数据协定的过程很简单.但是,有时完全控制 ...

  3. WCF学习心得------(七)消息协定

    第七章 消息协定 7.1 消息协定概述 通常情况下,在定义消息的架构时只使用数据协定就足够,但是有时需要精确控制如何将类型映射到通过网络传输的SOAP消息.对于这种情况,通常解决方案是插入自定义的SO ...

  4. 传说中的WCF(8):玩转消息协定

    Message翻译成中文,相信各位不陌生,是啊,就是消息,在WCF中也有消息这玩意儿,不知道你怎么去理解它.反正俺的理解,就像我们互发短信一个道理,通讯的双方就是服务器与客户端,说白了吧,就是二者之间 ...

  5. 我们一起学习WCF 第五篇数据协定和消息协定

    A:数据协定(“数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每个参数或 ...

  6. WCF基础

    初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充. SOA Service-Oriented Architecture,面向服务架构,粗粒度.开放式.松耦合的服务结构,将应用程序 ...

  7. [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

    老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...

  8. WCF学习笔记——WCF基础

    一 WCF与SOA SOA是一种通过为所有软件提供服务外观,并将这些服务的WSDL集中发布到一个地方的一种组织企业软件的方法.它通过使用明确定义的接口通过跨越边界传递消息来让多个自治的服务协同工作.S ...

  9. 【.net 深呼吸】记录WCF的通信消息

    前面老周给大伙伴们介绍了把跟踪信息写入日志文件的方法,今天咱们换个类似的话题来扯一下,对了,咱们就说说怎么把WCF的往来消息log下来吧. 尽管在现实生活中,我们不主张偷窥他人信息,不过,偷窥程序信息 ...

随机推荐

  1. http://bbs.51cto.com/thread-1070029-1-1.html

    http://bbs.51cto.com/thread-1070029-1-1.html

  2. 新人补钙系列教程之:3D理论 - 二进制空间分割(BSP)树

    1. 什么是BSP树 BSP算法的初始数据是一个多边形集,BSP在预处理的时候先在多边形集中选取一个多边形作为支持平面,然后根据这个平面将集合划分成两个部分,每个部分是一个新的子节点,递归进行该过程, ...

  3. phpMyAdmin搭建及管理多台数据库服务器

    phpMyAdmin搭建及管理多台数据库服务器 环境说明: 系统版本    CentOS 6.9 x86_64         软件版本    nginx-1.12.2        php-5.5. ...

  4. 2017.6.30 安装IDEA的插件mybatis plugin(破解版)

    参考来自:http://blog.csdn.net/u011410529/article/details/54098067 正常情况下的安装: 但是我的界面中找不到这个插件,而且这个插件是收费的. 1 ...

  5. 甲骨文Java Archive

    甲骨文Java Archive 甲骨文Java Archive提供自助下载访问我们的一些历史的Java版本. 警告: 这些旧版本的JRE和JDK来帮助开发人员提供了在旧系统调试问题. 他们没有更新最新 ...

  6. JAVA Eclipse如何开发Android的多页面程序

    Fragment可以认为是Activity的一个界面的组成部分,Fragment必须依存于Activity.   在layout文件夹中新建一个xml文件,布局方式采用RelativeLayout,注 ...

  7. 载入本地Html文件

    NSString * resousePath = [[NSBundle mainBundle]resourcePath];         NSString * filePath = [resouse ...

  8. 从零单排之玩转Python安全编程(II)

    转自:http://www.secpulse.com/archives/35893.html 都说Python大法好,作为一名合格的安全从业人员,不会几门脚本语言都不好意思说自己是从事安全行业的. 而 ...

  9. MySQL几个性能指标

    近期参加了一个DBA MySQL的分享,主要从MySQL的性能指标分析.同步及运维三个方面分享一些经验,其中,一些经验值还是值得记录下来的: 对于一个MySQL实例,CRUD上限经验值如下: Quer ...

  10. Android Shader 颜色、图像渲染 paint.setXfermode

    Shader Shader是一个基类,表示在绘制期间颜色的水平跨度 它的子类被嵌入在Paint中使用,调用paint.setShader(shader). 除Bitmap外的其他对象,使用该Paint ...