[IT168 技术新闻] Aaron Skonnard在这一期的MSDN Magazine上发表了一篇文章WCF Messaging Fundamentals。他在这篇文章里介绍了WCF的消息层、System.Xml命名空间的改进,并对使用消息和消息请求提供了指导。
Windows Communication Foundation(WCF,代号Indigo)的最上层是服务层,用于提供高层API,包括服务和数据约束、绑定、代理和转发器。很多WCF开发者仅使用服务层来完成其工作。在这个高层API之下,WCF提供了成熟的、基于XML的消息层。默认情况下,WCF在传递消息时使用XML 1.0、SOAP 1.2和WS-Addressing 1.0协议,但WCF允许从消息基础架构的各方面对其进行设置。这种灵活性是依靠这两种关键特性实现的——各种XML表现和Message类。
XML表现
XmlDictionaryReader和XmlDictionaryWriter类扩展了System.Xml命名空间。除了字符串表现形式之外,这两个类还都提供了字节表示。可以在下面几种表现形式中作出选择:
l XML 1.0文本
l MTOM二进制(Message Transmission Optimization Mechanismis一个W
l 二进制(.NET到.NET)
WCF允许在传递消息时选择使用哪种XML表现形式。如果需要进行互操作,则需要选择XML 1.0文本表现形式。如果既需要互操作,又希望利用二进制数据的有效载荷,则可以选择MTOM表现形式。如果整个环境都是基于.NET的,直接用二进制表现形式可能带来最好的性能。关键是,你必须作出一个选择。
Message类
Message类是XML消息的一个表现,由消息体和可选的消息头组成。尽管这一概念是直接映射到SOAP信封的,但WCF还支持SOAP的其它格式。可以通过System.Xml命名空间中提供的XML API来访问消息的内容,例如上面提到的XmlDictionaryReader和XmlDictionaryWriter。Message类提供了很多用访问和创建消息的方法:
……Message类本身是消息体和消息头集合和属性的模型。其方法主要用于创建消息、读写消息体和管理消息头集合和属性。
在创建消息时,消息的版本控制着消息的格式:
当从头开始创建消息时,必须指定动作、消息的版本和消息体。动作唯一标识了消息的意图或语义。WCF根据动作将传入的消息分派到恰当的方法中。消息的版本指出了传递过程中使用的SOAP和WS-Addressing版本。
如果希望使用POX (Plain-Old-XML)风格的消息来取代SOAP,可以配置Message Version。在Blog文章HTTP/POX Programming Basics中,Steve Maine展示了在Orcas中通过WCF来处理POX消息是多么的容易。
在文章最后,Aaron Skonnard描述了消息的生命周期和不同的消息状态:
Message对象开始于Created状态,这是唯一可以对消息体进行处理的有效状态。对消息的处理有很多种——读、写或复制。调用GetReaderAtBodyContents或GetBody可以将其状态改变成Read。调用WriteMessage或WriteBody可以将其状态改变为Written。调用CreateBufferedCopy将会把状态改变为Copied。一旦Message对象的状态不再是Created,对任何需要访问消息体的方法的调用都会抛出异常。例如,在调用过GetBody之后再调用一次,就会导致一个异常。如果遇到需要对消息体进行多次处理的情况,可以通过调用CreateBuffferedCopy来创建一个缓存的副本,或者将消息体加载到一个XmlDocument中,在或者将其反序列化成一个.NET对象。
该文章和伴随的列表清楚地展示了使用WCF实现纯XML消息是多么容易。尽管在开发面向服务的系统时,使用消息是一种比较自然的途径,但服务层还是支配着大多数使用WCF的开发者。这一方面是因为微软和微软的布道者们大力推荐这种模型,一方面也是因为没有很好的XML消息实例代码和业界介绍。
http://www.infoq.com/news/2007/03/wcf-messaging-fundamentals