Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >菜菜从零学习WCF七(消息协定)

菜菜从零学习WCF七(消息协定)

作者头像
aehyok
发布于 2018-08-31 02:01:07
发布于 2018-08-31 02:01:07
2.6K0
举报
文章被收录于专栏:技术博客技术博客
  • 消息协定概述

    通常,定义消息的架构时使用数据协定就足够了

    有时必须精确控制如何将类型映射到通过网络传输的SOAP消息。

    对于这种情况,最常见的方案是插入自定义SOP标头。

    另一种常见方案是定义消息头和正文的安全属性,也就是说,确定是否对这些元素进行数字签名和加密。消息样式的操作可提供这种控制。

    消息样式的操作最多具有一个参数和一个返回值,其中参数和返回值的类型都是消息类型;也就是说,这两种类型可直接序列化为指定的SOP消息结构。

    可以是用MessageCOntractAttribute标记的任何类型或Message类型。

  • 定义消息协定

    若要为某一类型定义消息协定(即定义该类型和SOAP信封之间的映射),请对该类型应用MessageContractAttribute.然后对该类型中要成为SOAP标头的成员应用MessageHeaderAttribute,并对要成为消息的SOAP正文部分的成员应用MessageBodyMemberAttibute.

    可以对所有字段、属性和事件应用MessageHeaderAttribute和MessageBodyMemberAttribute,而不管这些字段、属性和事件是公用的、私有的、受保护的还是内部的

  • 在消息协定内部使用自定义类型

    每个单独的消息头和消息正文部分均使用为消息所使用的服务协定选择的序列化引擎进行序列化(转换为XML).

      默认序列化引擎XmlFormatter可以显式处理(通过具有System.Runtime.Serialization.DataContractAttribute)或隐式处理(通过作为基元类型而具有System.SerializableAttribute等)具有数据协定的任何类型

    可以采用两种方式在消息协定中使用重复元素的数组。直接在数组上使用MessageHeaderAttribute或MessageBodyMemberAttribute,另外就是直接使用MessageHeaderArrayAttribute

  • 对消息部分进行签名和加密

    消息协定可以指示消息和正文是否应进行数字签名和加密

    通过在MessageHeaderAttribute和MessageBodyMemberAttribute属性(attribute)上设置System.ServiceModel.MessageContractMemberAttributre.ProtectionLevel属性(property)来完成

    System.Net.Security.ProtectionLevel

      None(不加密或 签名)

      Sign(近数字签名)

      EncryptAndSign(加密并数字签名)

    默认值为None

    若要让这些安全功能起作用,必需正确配置绑定和行为。如果在没有正确配置的情况下使用这些安全功能(例如,在不提供凭据的情况下试图对消息进行签名),则会在验证时引发异常

    对于消息头,会分别为每个消息头确定其保护级别

    对于消息正文,保护级别可理解为“最低保护级别”。无论包含几个正文部分,正文都只有一个保护级别。正文的保护级别由所有正文部分的最高ProtectionLevel属性设置确定。不过,您应该将每个正文部分的保护级别设置为实际要求的最低保护级别

  • 控制标头和正文部分的名称和命名空间

    在消息协定的SOAP表示形式中,每个标头和正文部分都映射为一个具有名称和命名空间的XML元素。通过操作System.ServiceModel.MessageContractMemberAttribute.Name和System.ServiceModel.MessageContractMemberAttribute.NameSpace(在MessageHeaderAttribute和MessageBodyMemberAttribute属性的父类上)可以更改这些默认值

  • 控制是否包装SOAP正文部分

  默认情况下,SOAP正文部分会在包装元素内部进行序列化

    若要取消包装元素,请将IsWrapped舒心设置为false.

    若要控制包装元素的名称和命名空间,请使用WrapperName和WrapperNameSpace属性

  • SOAP标头属性

  SOAP标准定义了下列可存在于标头上的属性:

      Actor/Role(在SOAP1.1中为Actor,在SOAP1.2中为Role)指定要使用给定标头的节点的统一资源标识符

      MustUnderstand指定醋栗标头的节点是否必须理解该标头

      Relay指定要将标头中继大下游节点

    WCF不会对传入消息的这些属性执行任何处理(MustUnderstand除外)

    静态方式将这些属性设置为任何需要的值

    也可以通过代码以动态方式控制这些属性

    如果同时使用动态和静态控制机制,则静态设置用作默认设置,但可以在以后使用动态机制重写

  • SOAP正文部分的顺序

    默认情况下,正文元素采用字母顺序

    可以通过System.ServiceModel.MessageBodyMemberAttribute.Order属性进行控制

    在消息协定中,基类型正文成员不排列在派生类型正文成员之前

  • 消息协定版本管理

    更改消息协定

     应用程序的新版本可能会向消息中添加额外的标头。在从新版本应用程序向旧版本应用程序发送消息时,系统必需处理额外的标头,同样,反方向操作时系统必需处理缺少的标头

   下面的规则适用于标头的版本管理:

      WCF不反对缺少标头,相应的成员将保留其默认值。

     WCF还忽略意外的额外标头,此规则的一种例外情况在传入的SOAP消息中,额外标头的MustUnderstand属性设置为true.在这种情况下,由于存在一个无法处理但必需理解的标头,因此会引发异常。

   消息正文具有类似的版本管理规则,即忽略缺少和附加的消息正文部分

性能注意事项

  每个消息头和消息正文部分相互独立的进行序列化。因此,可以为每个标头和正文部分重新声明相同的命名空间。为了提高性能,特别是对于消息在网络上的大小,请将多个标头和正文部分合并成一个标头或正文部分

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-03-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
菜菜从零学习WCF六(数据协定)
  --默认情况下,Windows Communication Foundation(WCF)使用称为数据协定序列化程序的序列化引擎对数据进行序列化和反序列化(与XML进行相互转换)
aehyok
2018/08/31
9690
WCF技术剖析之十七:消息(Message)详解(下篇)
《WCF技术剖析(卷1)》自出版近20天以来,得到了园子里的朋友和广大WCF爱好者的一致好评,并被卓越网计算机书店作为首页推荐,在这里对大家的支持表示感谢。同时我将一直坚持这个博文系列,与大家分享我对WCF一些感悟和学习经验。在《消息(Message)详解》系列的上篇和中篇,先后对消息版本、详细创建、状态机和基于消息的基本操作(读取、写入、拷贝、关闭)进行了深入剖析,接下来我们来谈谈消息的另一个重要组成部分:消息报头(Message Header)。 按照SOAP1.1或者SOAP1.2规范,一个SOAP消
蒋金楠
2018/01/16
1.2K0
WCF技术剖析之十七:消息(Message)详解(下篇)
菜菜从零学习WCF二(设计和实现服务协定)
  服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。
aehyok
2018/09/11
8870
菜菜从零学习WCF二(设计和实现服务协定)
WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)
[爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道《天天山海经》为此录制的节目视频(苏州话)]]通过上篇的介绍,我们知道了WCF所有与编码与解码相关的功能都实现在相应的System.Xml.XmlDictionaryWriter和System.Xml.XmlDictionaryReader中。但是在真正的WCF处理框架中,却并不直接使用XmlDictioanryWriter和XmlDictionaryReader对象,而通过相应的消息编码器(System.ServiceModel.Cha
蒋金楠
2018/01/16
1.1K0
WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)
WCF技术剖析之三十一: WCF事务编程[中篇]
[续《上篇》]通过将TransactionFlowAttribute特性应用在服务契约的某个操作之上,并指定相应的TransactionFlowOption枚举直,仅仅定义了事务流转的策略而已。或者说,通过这种方式确定对事物流转的一种意愿,客户端是否愿意将当前事务流出,服务端是否愿意接受流入的事务,可以通过TransactionFlowAttribute特性进行控制。所以说,服务操作上定义个TransactionFlowAttribute特性是是否进行事务流转的总开关,真正的事务传播是建立在Transact
蒋金楠
2018/01/16
7370
WCF技术剖析之三十一: WCF事务编程[中篇]
快速入门系列--WCF--01基础概念
转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式。记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winform时,使用过Remoting,再之后做B/S架构时,就会经常使用.NET平台下的Web Service,直到使用上WCF。看上去有了一些WCF的使用经验,实则不然,比如对安全、分布式事务、可靠会话等主题仍然接触甚少,因而决定重新回顾学习一下相关知识,尤其是对WCF框架的理解(已于2015年开源,可下载源码,h
用户1216676
2018/01/24
1.1K0
快速入门系列--WCF--01基础概念
WCF后续之旅(17):通过tcpTracer进行消息的路由
对于希望对WCF的消息交换有一个深层次了解的读者来说,tcpTracer绝对是一个不可多得好工具。我们将tcpTracer置于服务和服务代理之间,tcpTracer会帮助我们接获、显示和转发流经他的消息。 从本质上讲,tcpTracer是一个路由器。当启动的时候,我们需要设置两个端口:原端口(source port)和目的端口(destination port),然后tcpTracer就会在原端口进行网络监听。一旦请求抵达,他会截获整个请求的消息,并将整个消息显示到消息面板上。随后,tcpTracer会将
蒋金楠
2018/01/16
7070
WCF后续之旅(17):通过tcpTracer进行消息的路由
WCF后续之旅(3): WCF Service Mode Layer 的中枢—Dispatcher
在本系列的第一部分、第二部分中,我们对WCF的channel layer进行了深入的讨论。我们接下来继续讨论WCF的service mode layer。本篇文章着重介绍service 端的ServiceMode。写作此篇文章旨在达到以下两个目的: 希望读者对ServiceMode有一个大致的了解,结合前面介绍的channel layer的相关知识,帮助读者了解WCF的整个实现机制和执行的流程。 介绍ServiceMode涉及到的绝大部分extension point,让读者在具体的项目开发中能够根据实
蒋金楠
2018/01/16
7070
WCF服务端运行时架构体系详解[下篇]
作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象。站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象。如果站在WCF服务端运行时框架来说,终结点实际上指代的是终结点分发器(EndpointDispatcher)。而ServiceEndpoint与EndpointDispatcher是一一匹配的,并且前者是创建后者的基础。而终结点分发器具有自己的运行,即分发运行时(DispatchRuntime)。 目录 一、终结点分发器(EndpointDisp
蒋金楠
2018/02/07
8310
WCF服务端运行时架构体系详解[下篇]
WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
在本篇文章中,我们将讨论WCF四大契约(服务契约、数据契约、消息契约和错误契约)之一的消息契约(Message Contract)。服务契约关注于对服务操作的描述,数据契约关注于对于数据结构和格式的描述,而消息契约关注的是类型成员与消息元素的匹配关系。 我们知道只有可序列化的对象才能通过服务调用在客户端和服务端之间进行传递。到目前为止,我们知道的可序列化类型有两种:一种是应用了System.SerializableAttribute特性或者实现了System.Runtime.Serialization.I
蒋金楠
2018/01/16
1.7K0
WCF技术剖析之十七:消息(Message)详解(上篇)
消息交换是WCF进行通信的唯一手段,通过方法调用(Method Call)形式体现的服务访问需要转化成具体的消息,并通过相应的编码(Encoding)才能通过传输通道发送到服务端;服务操作执行的结果也只能以消息的形式才能被正常地返回到客户端。所以,消息在整个WCF体系结构中处于一个核心的地位,WCF可以看成是一个消息处理的管道。 尽管消息在整个WCF体系中具有如此重要的意义,可是一般的WCF编程人员,却意识不到消息的存在。原因很简单,WCF设计的目标就是实现消息通信的所有细节,为最终的编程人员提供一个完全
蒋金楠
2018/01/16
2.7K0
菜菜从零学习WCF八(Message类)
Message类是WCF的基本类。客户端与服务之间的所有通信最终都会产生要进行发送和接收的Message实例,通常不会与Message里直接进行交互。相反,您需要使用WCF服务
aehyok
2019/02/25
8480
菜菜从零学习WCF十(序列化)
 本次课程的主要内容包括以下四格部分:DataContractSerializer、序列化、反序列化、XmlSerializer
aehyok
2018/09/11
1.1K0
[WCF安全系列]消息的保护等级[下篇]
一、契约的保护等级为绑定进行消息保护设置了“最低标准” 二、显式地将保护等级设置成ProtectionLevel.None与没有设置保护等级有区别吗? 三、消息的保护等级与WS-Addressing 一、契约的保护等级为绑定进行消息保护设置了“最低标准” 定义在契约上消息保护级别实际上为WCF实施消息保护设置了一个“最低标准”。由于整个消息保护机制,不论是签名还是加密,都是在信道层实现的。而信道层最终是通过绑定来实现的,绑定的属性决定了信道层处理消息的能力。而绑定安全方面的
蒋金楠
2018/01/16
1.2K0
[WCF安全系列]消息的保护等级[下篇]
[WCF安全系列]消息的保护等级[上篇]
到目前为止,对于WCF安全传输的三个方面,我们已经对认证进行了详细的介绍,现在我们来关注另外两个话题:消息的一致性和机密性,两者又统称为消息保护(Message Protection)。消息的安全等级指的是对整个消息或者消息的某个部分事实安全保护采用的等级。按照级别的由低到高,WCF支持如下三种不同的安全等级。在WCF的应用编程接口中,消息保护级别通过如下定义的ProtectionLevel枚举表示。 None:不采用任何措施来保护消息的一致性和机密性; Sign:通过对整个消息或者消息的某个部分进行数字
蒋金楠
2018/02/07
8910
[WCF安全系列]消息的保护等级[上篇]
WCF系列教程之WCF客户端调用服务
1、创建WCF客户端应用程序需要执行下列步骤 (1)、获取服务终结点的服务协定、绑定以及地址信息 (2)、使用该信息创建WCF客户端 (3)、调用操作 (4)、关闭WCF客户端对象 二、操作实例 1、
郑小超.
2018/01/26
2.1K0
WCF 4.0路由服务Routing Service
在面向服务的应用系统中,最重要的概念就是消息,消息的传输是一个非常重要的问题。而在大多数情况下,消息要经历多个网络节点,这里会涉及到消息路由问题。WS规范很早就制定了对于消息路由问题的解决办法,这里最早的就是WS-Routing 。当然后来逐渐为更完善的规范WS-Addressing取代。 支持对于消息路由,WCF4.0之前的框架没有提供支持,在WCF4.0里又重新加入对于消息路由机制的支持。当然这里我们学习消息路由,首先还是来了解一下与消息路由相关的一些规范,下面我们就来依次看一下WS-Routing和W
张善友
2018/01/30
1.3K0
WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[上篇]
对于上一篇文章 (WCF基本异常处理模式:[上篇]、[中篇]、[下篇]),主要是站在最终开发者的角度对WCF关于异常处理编程模式进行了介绍,接下来,我们需要将我们的目光转移到WCF框架内部,深入剖析整个WCF异常处理流程。在基于SOAP的消息交换过程中,异常最终通过Fault消息承载,所以很自然地,接下来的介绍从SOAP Fault说起。 一、 从SOAP Fault说起(基于SOAP 1.2) 服务调用的最终实现通过消息交换完成,WCF本质上可以看成是一个消息处理的框架。消息,不但承载着正常服务调用的请
蒋金楠
2018/01/16
1.2K0
WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[下篇]
WCF客户端和服务端的框架体系相互协作,使得开发人员可以按照我们熟悉的方式进行异常的处理:在服务操作执行过程中抛出异常(FaultException),在调用服务时捕获异常,完全感觉不到“分布式”的存在,如同典型的“本地”操作一般。为了实现这样的效果,WCF在内部为我们作了很多。 消息交换是WCF进行通信的唯一手段,消息不仅仅是正常服务调用请求和回复的载体,服务端抛出的异常,甚至是服务的元数据都是通过消息的形式传向客户端的。所以,实现异常与消息之间的转换是整个异常处理体系的核心,而WCF的异常处理框架就着
蒋金楠
2018/01/16
9390
WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[下篇]
WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WCF传递到客户端;如果将开启了IncludeExceptionDetailInFaults的ServiceDebug服务行为通过声明(通过在服务类型上应用ServiceBehaviorAttrite特性)或者配置的方式应用到相应的服务上,异常相关的所有细节信息将会原封不动地向客户端传送。 这两种方式体现了两种极
蒋金楠
2018/01/16
1.3K0
WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
推荐阅读
相关推荐
菜菜从零学习WCF六(数据协定)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文