WCF技术剖析之十七:消息(Message)详解(下篇)

《WCF技术剖析(卷1)》自出版近20天以来,得到了园子里的朋友和广大WCF爱好者的一致好评,并被卓越网计算机书店作为首页推荐,在这里对大家的支持表示感谢。同时我将一直坚持这个博文系列,与大家分享我对WCF一些感悟和学习经验。在《消息(Message)详解》系列的上篇和中篇,先后对消息版本、详细创建、状态机和基于消息的基本操作(读取、写入、拷贝、关闭)进行了深入剖析,接下来我们来谈谈消息的另一个重要组成部分:消息报头(Message Header)。

按照SOAP1.1或者SOAP1.2规范,一个SOAP消息由若干SOAP报头和一个SOAP主体构成,SOAP主体是SOAP消息的有效负载,一个SOAP消息必须包含一个唯一的消息主体。SOAP报头是可选的,一个SOAP消息可以包含一个或者多个SOAP报头,SOAP报头一般用于承载一些控制信息。消息一经创建,其主体内容不能改变,而SOAP报头则可以自由地添加、修改和删除。正是因为SOAP的这种具有高度可扩展的设计,使得SOAP成为实现SOA的首选(有这么一种说法SOAP= SOA Protocol)。

按照SOAP 1.2规范,一个SOAP报头集合由一系列XML元素组成,每一个报头元素的名称为Header,命名空间为http://www.w3.org/2003/05/soap-envelope。每一个报头元素可以包含任意的属性(Attribute)和子元素。在WCF中,定义了一系列类型用于表示SOAP报头。

一、MessageHeaders、MessageHeaderInfo、MessageHeader和MessageHeader<T>

在Message类中,消息报头集合通过只读属性Headers表示,类型为System.ServiceModel.Channels.MessageHeaders。MessageHeaders本质上就是一个System.ServiceModel.Channels.MessageHeaderInfo集合。

   1: public abstract class Message : IDisposable   2: {   3:     //其他成员   4:     public abstract MessageHeaders Headers { get; }   5: }   1: public sealed class MessageHeaders : IEnumerable<MessageHeaderInfo>, IEnumerable   2: {   3:     //省略成员   4: }

MessageHeaderInfo是一个抽象类型,是所有消息报头的基类,定义了一系列消息SOAP报头的基本属性。其中Name和Namespace分别表示报头的名称和命名空间,Actor、MustUnderstand、Reply与SOAP 1.1或者SOAP 1.2规定SOAP报头同名属性对应。需要对SOAP规范进行深入了解的读者可以从W3C官方网站下载相关文档。

   1: public abstract class MessageHeaderInfo   2: {   3:     protected MessageHeaderInfo();   4:   5:     public abstract string Actor { get; }   6:     public abstract bool     IsReferenceParameter { get; }   7:     public abstract bool     MustUnderstand { get; }   8:     public abstract string Name { get; }   9:     public abstract string Namespace { get; }  10:     public abstract bool     Relay { get; }  11: }

当我们针对消息报头编程的时候,使用到的是另一个继承自MessageHeaderInfo的抽象类:System.ServiceModel.Channels.MessageHeader。除了实现MessageHeaderInfo定义的抽象只读属性外,MessageHeader中定义了一系列工厂方法(CreateHeader)方便开发人员创建MessageHeader对象。这些CreateHeader方法接受一个可序列化的对象,并以此作为消息报头的内容,WCF内部会负责从对象到XML InfoSet的序列化工作。此外,可以通过相应的WriteHeader方法对MessageHeader对象执行写操作。MessageHeader定义如下:

   1: public abstract class MessageHeader : MessageHeaderInfo   2: {   3:     public static MessageHeader CreateHeader(string name, string ns, object value);   4:     public static MessageHeader CreateHeader(string name, string ns, object value, bool mustUnderstand);   5:     //其他CreateHeader方法   6:   7:     public void WriteHeader(XmlDictionaryWriter writer, MessageVersion messageVersion);   8:     public void WriteHeader(XmlWriter writer, MessageVersion messageVersion);   9:     //其他WriteHeader方法  10:  11:     public override string Actor { get; }  12:     public override bool IsReferenceParameter { get; }  13:     public override bool MustUnderstand { get; }  14:     public override bool Relay { get; }  15: }

除了MessageHeader,WCF还提供一个非常有价值的泛型类:System.ServiceModel. MessageHeader<T>,泛型参数T表示报头内容对应的类型,MessageHeader<T>为我们提供了强类型的报头创建方式。由于Message的Headers属性是一个MessageHeaderInfo的集合,MessageHeader<T>并不能直接作为Message对象的消息报头。GetUntypedHeader方法提供了从MessageHeader<T>对象到MessageHeader对象的转换。MessageHeader<T>定义如下:

   1: public class MessageHeader<T>   2: {   3:     public MessageHeader();   4:     public MessageHeader(T content);   5:     public MessageHeader(T content, bool mustUnderstand, string actor, bool relay);   6:     public MessageHeader GetUntypedHeader(string name, string ns);   7:   8:     public string Actor { get; set; }   9:     public T Content { get; set; }  10:     public bool MustUnderstand { get; set; }  11:     public bool Relay { get; set; }  12: }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, soap
, 消息
, public
, abstract
一个
,以便于您获取更多的相关知识。

时间: 2024-10-29 17:46:06

WCF技术剖析之十七:消息(Message)详解(下篇)的相关文章

WCF服务端运行时架构体系详解[下篇]

作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象.站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象.如果站在WCF服务端运行时框架来说,终结点实际上指代的是终结点分发器(EndpointDispatcher).而ServiceEndpoint与EndpointDispatcher是一一匹配的,并且前者是创建后者的基础.而终结点分发器具有自己的运行,即分发运行时(DispatchRuntime). 目录 一.终结点分发器(EndpointDispa

WCF技术剖析之十七:消息(Message)详解(上篇)

消息交换是WCF进行通信的唯一手段,通过方法调用(Method Call)形式体现的服务访问需要转化成具体的消息,并通过相应的编码(Encoding)才能通过传输通道发送到服务端:服务操作执行的结果也只能以消息的形式才能被正常地返回到客户端.所以,消息在整个WCF体系结构中处于一个核心的地位,WCF可以看成是一个消息处理的管道. 尽管消息在整个WCF体系中具有如此重要的意义,可是一般的WCF编程人员,却意识不到消息的存在.原因很简单,WCF设计的目标就是实现消息通信的所有细节,为最终的编程人员提

WCF技术剖析之十七:消息(Message)详解(中篇)

在上篇中大体上围绕着Message的两个话题进行讲述:消息版本(Message Version)和采用五种不同的方式创建Message.本篇文章将会详细介绍Message的另外两个主题:和消息的基本操作,比如读.写.拷贝.关闭等,以及消息状态机(Message State Machine). 知道了消息是如何创建的,我们接着讨论消息的一些基本的操作.除了上面介绍的消息创建之外,一个消息涉及到的操作大体分为以下4类: 读消息:读取整个消息的内容或者有选择地读取报头或者主体部分内容: 写消息:将整个

WCF技术剖析系列文章汇总

WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇] WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇] WCF技术剖析之二十九:换种不同的方式调用WCF服务 WCF技术剖析之二十八:自己动手获取元数据 WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的 WCF技术剖析之二十七: 如何将一个服务发布成WSDL WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇] WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展

WCF服务端运行时架构体系详解[上篇]

WCF的服务端架构体系又可以成为服务寄宿端架构体系.我们知道,对于一个基于某种类型的服务进行寄宿只需要使用到一个唯一的对象,那就是ServiceHost.甚至在某种语境下,我们所说的服务实际上就是指的对应的ServiceHost对象.整个服务寄宿过程包括两个阶段,即服务描述的创建和服务端运行框架的建立.而第一个阶段创建的服务描述是为了第二个阶段对服务端运行时框架建立服务的,所以我们有必要在对服务描述进行简单的介绍. 目录: 一.从服务描述(Service Description)谈起 二.服务端

WCF服务端运行时架构体系详解[续篇]

终结点分发器在自己的运行时中对请求消息的处理最终肯定体现在相应操作的执行.如果从服务描述的角度来看,操作是一个OperationDescription对象.而服务端分发运行时中的操作则代表的是一个DispatchOperation对象.作为服务描述的一部分,服务所有终结点的所有操作描述(OperationDescription)在ServiceHost创建过程中被创建.而当ServiceHost被正常开始时,这些操作描述最终转换成分发操作(DispatchOperation).而Dispatch

WCF服务端运行时架构体系详解[中篇]

在这篇文章中,我们对信道分发器本身作一个深入的了解,首先来看看它具有哪些可供扩展的组件,以及我们可以针对信道分发器对WCF实现哪些可能的扩展. 目录: ErrorHandler & ServiceThrottle ChannelInitializer IncludeExceptionDetailInFaults ManualAddressing MaxPendingReceives ReceiveSynchronously IsTransactedReceive & MaxTransact

WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化

在本篇文章中,我们将讨论WCF四大契约(服务契约.数据契约.消息契约和错误契约)之一的消息契约(Message Contract).服务契约关注于对服务操作的描述,数据契约关注于对于数据结构和格式的描述,而消息契约关注的是类型成员与消息元素的匹配关系. 我们知道只有可序列化的对象才能通过服务调用在客户端和服务端之间进行传递.到目前为止,我们知道的可序列化类型有两种:一种是应用了System.SerializableAttribute特性或者实现了System.Runtime.Serializat

WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)

通过<如何将一个服务发布成WSDL[编程篇]>的介绍我们知道了如何可以通过编程或者配置的方式将ServiceMetadataBehavior这样一个服务形式应用到相应的服务上面,从而实现基于HTTP-GET或者WS-MEX的元数据发布机制.那么在WCF内部具体的实现原理又是怎样的呢?相信很多人对此都心存好奇,本篇文章的内容将围绕着这个主题展开. 一. 从WCF分发体系谈起 如果读者想对WCF内部的元数据发布机制的实现原理有一个全面而深入的了解,必须对WCF服务端的分发体系有一个清晰的认识.在这