第5章:消息
System.ServiceModel.Channels.Message抽象类型是Microsoft Windows Communication Foundation (WCF)里通信的基本单位。尽管Message类型使用在 WCF 程序里,但是WCF的开发人员却不需要直接接触Message。因此,可以不与任 何Message的实例交互就能写出一个功能丰富的WCF程序。但是,虽然你的代码没 有直接与Message对象交互,记住WCF基础结构也在背后忙于创建、发送、接受或 者其它处理Message对象的工作。
注意本章里使用的词语,当我使用Message的时候,指的的是 System.ServiceModel.Channels.Message 类型。当我使用message,指的是发送 和接收数据的抽象概念。(老徐翻译本书的时候Message一律翻译为:Message类 型,因为它是.NET的内建类型。 message一律翻译为:消息。这里不会混淆。)
如果WCF基础结构已经为我们做了Message类型的处理工作,为什么我们还要 花费这么多时间和精力去搞明白Message类型呢?在我看来,有2个重要原因。首 先,许多WCF公共定制功能(像behaviors和encoders编码器)需要直接与 Message 类型交互。如果你不知道Message类型,这会花费更多的时间,并且你 也许会给WCF基础结构带来非常严重的后果。其次,我发现,扎实地掌握 Message类型会有效提高你对WCF的整体理解能力。在某些层次上,WCF基础结构 就是在产生、发送、接受或者处理Message对象,因此,理解 Message类型是理 解WCF内部工作机制的基础。为了使你可以扩展WCF的知识并加强你对WCF的理解 ,这一章会解释Message类型的核心功能,以及与Message对象交互的其它类型。
Message类型介绍
Message引用类型是WCF应用对SOAP消息的抽象。由于与SOAP消息如此紧密的 关系,Message类型定义了表示SOAP版本、信封、消息头、消息头块和消息体元 素的成员。和其它以XML为中心的WCF类型一样,Message类型构建于XML Infoset 之上。从作用上讲,Message类型实际是对数据存储的一个包装,并且这个数据 存储就是一个XML Infoset。
Image from book
Message类型和SOAP
Message类型和SOAP之间的关系这里需要解释一下。当Microsoft的架构师设 计WCF的时候,他们预料到XML和SOAP会成为所有消息应用的标准结构。而整个行 业也在往此方向发展。绝大部分,不是全部的话,现在的消息平台已经支持发送 和接收XML消息。许多平台把SOAP作为首要的消息结构。意识到这些问题,微软 的架构师得出SOAP和XML是首选消息结构的结论,Message类型完全支持SOAP,并 且在对象模型里封装了SOAP语义。
Message类型的结构可以轻易满足非SOAP类型的XML应用系统。Message类型能 够简单地去除SOAP消息结构而发送朴素旧的XML消息(Plain Old XML (POX) messages)。当Message类型必须适应一个非XML平台的应用系统的时候,还会有 问题产生。最显著的一个例外就是JavaScript Object Notation(JSON)。和你 名字表达的意思一样,JSON是JavaScript表示对象的一种方式,而且完全被支持 AJAX的技术兼容,像Microsoft ASP.NET AJAX。
考虑下面场景的例子:一个Web程序需要使用一个数组的值异步更新一个 drop-down list。假设这个数组的值是有页面上的另外一个控件控制。使用 Microsoft ASP.NET和ASP.NET AJAX,我们可以很简单地实现信息检索和局部刷 新页面内容。那么假如你需要从WCF来获取数据呢?这种情况下,应答消息需要 使用JSON格式的数组,而不是XML。对于这种类型的应用程序,浏览器处理XML是 非常困难和复杂的。对象渲染为JSON,换句话说,非常容易通过JavaScript传递 drop-down list的值。
咋一看,JSON好像是应用在Message类型实例上的又一个编码器,很像消息传 输优化机制(MTOM)。近距离观察,你会发现几个问题。对于初学者,JSON没有 任何XML的namespaces 和属性。我们虚构的JSON编码器需要提取XML信息。确切 地说,JSON里字符串的顺序非常重要。在XML里,schema定义了元素的顺序。如 果 schema没有要求XML消息的顺序,可能转换为等价的JSON对象就会非常的困难 。为了解决这个问题,WCF团队将会发布几个额外的类型帮助 Message类型的序 列化。
Image from book
在整个生命周期里,在传输到其它消息 参与者之前,Message对象必须经过几次转换。从发送者角度来看,这个转换包 含2个步骤:序列化和编码。Message序列化是把Message 实例转换为XML Infoset, 编码是把XML Infoset转换为特定的数据格式。从接受者角度来看, 这个转换正好与发送者相反。换句话说,接受者必须反编码接收到的数据位 Infoset,然后在反序列化Infoset为一个Message实例。
Message对象模 型更多的专注于Message的序列化和反序列化,它们中的绝大部分影响了WCF应用 程序编程接口(API)里的其它类型。因此,在研究 Message类型前,有必要知 道序列化和编码的类型。下一张我们会先看一下负责Message序列化和编码的基 本类型。此后,我们将继续详细学习 Message类型。
【老徐备注】
1. JSON(JavaScript Object Notation) 是一种轻量 级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用 了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。JSON建构于两种数据类 型:
(1)“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构 (struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
(2)值的有序列表( An ordered list of values)。在大部分语言中,它被理解为数组(array)。
参考:http://json.org/json-zh.html
2. 读音:[e:j^ks] 。 AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和 XML),AJAX并非缩写词,而是由Jesse James Gaiiett创造的名词,是指一种创 建交互式网页应用的网页开发技术。
【地 址】: http://www.cnblogs.com/frank_xl/