第5章:消息
System.ServiceModel.Channels.Message抽象类型是Microsoft Windows Communication Foundation (WCF)里通信的基本单位。尽管Message类型使用在WCF程序里,但是WCF的开发人员却不需要直接接触Message。因此,可以不与任何Message的实例交互就能写出一个功能丰富的WCF程序。但是,虽然你的代码没有直接与Message对象交互,记住WCF基础结构也在背后忙于创建、发送、接受或者其它处理Message对象的工作。
如果WCF基础结构已经为我们做了Message类型的处理工作,为什么我们还要花费这么多时间和精力去搞明白Message类型呢?在我看来,有2个重要原因。首先,许多WCF公共定制功能(像behaviors和encoders编码器)需要直接与Message类型交互。如果你不知道Message类型,这会花费更多的时间,并且你也许会给WCF基础结构带来非常严重的后果。其次,我发现,扎实地掌握Message类型会有效提高你对WCF的整体理解能力。在某些层次上,WCF基础结构就是在产生、发送、接受或者处理Message对象,因此,理解Message类型是理解WCF内部工作机制的基础。为了使你可以扩展WCF的知识并加强你对WCF的理解,这一章会解释Message类型的核心功能,以及与Message对象交互的其它类型。
Message引用类型是WCF应用对SOAP消息的抽象。由于与SOAP消息如此紧密的关系,Message类型定义了表示SOAP版本、信封、消息头、消息头块和消息体元素的成员。和其它以XML为中心的WCF类型一样,Message类型构建于XML Infoset之上。从作用上讲,Message类型实际是对数据存储的一个包装,并且这个数据存储就是一个XML Infoset。
![Start Sidebar Image from book](http://www.cnblogs.com/frank_xl/admin/file:///C:/DOCUME~1/FRANKX~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif)
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类型的序列化。
|
|
在整个生命周期里,在传输到其它消息参与者之前,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建构于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(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://baike.baidu.com/view/1641.htm
【老徐的博客】
【作 者】:Frank Xu Lei
【地 址】:http://www.cnblogs.com/frank_xl/
【中文论坛】:微软WCF中文技术论坛
【英文论坛】:微软WCF英文技术论坛