Windows Communication Foundation (WCF) 通道堆栈编码

6.4  消息编码(Message Encoding)

消息作为WCF进行通信的唯一媒介,最终需要通过写入传输层进行传递。而消息进行传输的一个前提或是一项必不可少的工作是对消息进行相应的编码。WCF提供了一系列可供选择的编码方式,它们分别在互操作和性能方面各具优势。在本节我们将对各种编码方式进行消息的讨论。

6.4.1  序列化(反序列化)和编码(解码)

有些WCF的开发人员,甚至包括一些比较资深的开发人员,往往对序列化和编码分得不是很清楚,经常把序列化和编码混为一谈。对于WCF来说,序列化和编码具有明确的界限:序列化关注于如何将一个可序列化对象(数据契约和应用的SerializableAttribute特性或者实现了ISeriazlable接口)转换为XML InfoSet,反序列化则是通过解析XML Info生成相应托管对象的过程。通过序列化得到的XML InfoSet必须通过相应的编码(Encoding)才能被写入传输层,基于某种传输协议在网络中传递,而当经过编码的信息抵达接收方,接收方需要通过相应的解码方式对二进制信息进行解码(Decoding),解码生成的XML InfoSet被交付给相应的序列化器进行反序列化。

从序列化和编码在WCF整个框架体系所处的层次来看,序列化(反序列化)通过相应的MessageFormatter(ClientMessageFormatter和DispatchMessage)实现,而MessageFormatter最终又通过相应的Serializer(DataContractSerializer、XmlContractSerialzier等)完成真正的序列化(反序列化)工作。MessageFormatter处于WCF的服务模型层(SericeMode Layer),而编码则是在发生在信道层(Channel Layer)。在第3章介绍绑定的时候,我们说绑定是信道层的缔造者,组成绑定的绑定元素创建各自的信道(Channel)并串联成一个用于处理消息的管道:信道栈(Channel Stack)。对于任何一种绑定类型,消息编码绑定元素(Message Encoding Binding Element)和传输绑定元素(Transport Binding Element)是不可或缺的,一般来说前者位于后者之上。在WCF真正的执行框架中,消息编码绑定元素用于创建相应的编码器(Encoder),发送端的传输信道在消息写入传输层之前通过该编码器对消息进行编码,而接收端的传输信道通过此编码器对接收的二进制数据进行解码。

从互操作性的角度来看,编码方法很大程度上决定了跨平台支持的能力。有的编码方式是平台无关的,有的则仅限于某种特定的平台。WCF提供了3种典型的编码方式:Binary、Text和MTOM。Binrary以二进制的方式进行消息的编码,但是仅限于.NET平台之间的通信;Text则提供与平台无关的基于文本的编码方式。MTOM编码基于WS-MTOM规范,对于改善大规模二进制数据在SOAP消息的传输性能具有重大的意义,既然该编码方式遵循相应的规范,无疑这也是一种跨平台的编码方式。

 

 3种编码方式:Text、Binary和MTOM;对应3种不同的XmlDictionaryWriter/XmlDictionaryReader:XmlUTF8TextWriter/ XmlUTF8TextReader、XmlBinaryWriter/XmlBinaryReader和XmlMtomWriter/XmlMtomReader;3种XmlDictionary- Writer/XmlDictionaryReader又对应着3种MessageEncoder:TextMessageEncoder、BinaryMessagEncoder和MtomMessageEncoder;这3种不同的MessageEncoder又具有它们各自的MessageEncoderFactory:TextMessageEncoderFactory、BinaryMessageEncoderFactory和MtomMessageEncoderFactory。最终这3种MessageEncoderFactory被3种相应的MessageEncodingBindingElement用于进行具体的编码。

 

 

Windows Communication Foundation (WCF) 通道堆栈采用编码和传输通道将内部消息表示形式转换成其网络传输格式,并使用特定传输进行发送。用于 Web 服务互操作性的最常见传输是 HTTP,Web 服务使用的最常见编码是基于 XML 的 SOAP 1.1、SOAP 1.2 和消息传输优化机制 (MTOM)。

 

 

编码是将消息转换为一个字节序列的过程。解码是反向过程。Windows Communication Foundation (WCF) 包含三种类型的 SOAP 消息编码:文本、二进制和消息传输优化机制 (MTOM)。编码是将消息转换为一个字节序列的过程。解码是反向过程。Windows Communication Foundation (WCF) 包含三种类型的 SOAP 消息编码:文本、二进制和消息传输优化机制 (MTOM)。

 

1

TextMessageEncodingBindingElement 类

绑定元素,指定用于基于文本的 SOAP 消息的字符编码与消息版本管理。

TextMessageEncodingBindingElement 表示的文本编码互操作性最强,但效率最低的 XML 消息编码器。Web 服务或 Web 服务客户端通常可以理解文本 XML。但是,将大型二进制数据块作为文本传输不是有效的传输方式。

 

2

BinaryMessageEncodingBindingElement 类

用于指定编码消息时所采用的 .NET 二进制 XML 格式的绑定元素。

BinaryMessageEncodingBindingElement 是指定在编码消息时应该使用 .NET 二进制 XML 格式的绑定元素,它包含用于指定要使用何种字符编码以及 SOAP 与 WS-Addressing 版本的选项。二进制编码是效率最高但互操作性最低的编码选项。

 

3

MtomMessageEncodingBindingElement 类

指定消息传输优化机制 (MTOM) 消息所使用的编码和版本管理的绑定元素。

MTOMMessageEncodingBindingElement 表示指定使用消息传输优化机制 (MTOM) 编码的消息所用的字符编码和消息版本管理以及其他设置的绑定元素。MTOM 是一种用于在 WCF 消息中传输二进制数据的有效技术。MTOM 编码器会尝试在效率和互操作性之间建立平衡。MTOM 编码以文本形式传输大多数 XML,但通过按原样传输来优化大型二进制数据块的传输,无需将其转换为 base64 编码格式。

 

4

WebMessageEncodingBindingElement 类
在 Windows Communication Foundation (WCF) 绑定中使用纯文本 XML 与 JavaScript 对象表示法 (JSON) 消息编码以及“原始”二进制内容时,能够对其进行读写。

编码是将消息转换为一个字节序列的过程。解码是反向过程。这些过程都需要字符编码规范。WebMessageEncodingBindingElement 的工作方式是委托一系列内部编码器对纯文本 XML 与 JSON 编码以及“原始”二进制数据进行处理。委托由复合消息编码器来完成。

在不使用 SOAP 消息(由 WebHttpBinding 使用)的方案中,用该绑定元素及其复合编码器控制编码。这些方案包括“纯旧式 XML”(POX)、具象状态传输 (REST)、真正简单的整合 (RSS) 与 Atom 整合以及异步 JavaScript 和 XML (AJAX)。复合消息编码器不支持 SOAP 或 WS-Addressing,因此, MessageVersion 总是返回 None

在使用 WebMessageEncodingBindingElement(Encoding) 构造函数进行构造时可以使用编写字符编码配置绑定元素。 Encoding 值指定 JSON 与文本 XML 情况的编写行为。在读取时,将理解任何有效的消息编码与文本编码。

此构造函数对分配给池的读取器和编写器的最大数量设置默认值,这两个默认值在未分配新的读取器和编写器时分别可用于处理传入和传出消息。属性 MaxReadPoolSizeMaxWritePoolSize 也可以分别用来设置要分配的读取器和编写器最大数目。默认情况下,将分配 64 个读取器和 16 个编写器。

默认复杂性约束也由该构造函数在通过 ReaderQuotas 属性与该编码关联的 XmlDictionaryReaderQuotas 上进行设置,以防止某种类型的拒绝服务 (DOS) 攻击,这些攻击试图利用消息复杂性来占用终结点处理资源。

WebMessageEncodingBindingElement 含有可以创建消息编码器工厂的 CreateMessageEncoderFactory 方法,该消息编码器工厂会根据指定的内容类型按需生成 JSON、XML 或原始消息解码器与编码器。

WebMessageEncodingBindingElement 还可以提供针对 HTTP 请求流过的通道生成工厂与侦听器的方法。

复合编码器及其关联的类和配置组件在部分信任中可用,这种使用无需任何特殊权限。

 
 
 
5
MessageEncodingBindingElement 类(实现自定义消息编码器)

如果希望实现自定义消息编码器,请使用此类。若要实现自己的自定义消息编码器,必须提供以下三个抽象基类的自定义实现:

  • MessageEncodingBindingElement(用于指定对消息进行编码时所用消息版本的绑定元素。)

  • MessageEncoderFactory(一个抽象基类,表示用于生成消息编码器的工厂,消息编码器可从流中读取消息和将消息写入流以进行多种型的消息编码。)

  • MessageEncoder(是一个基类,可提供支持多用途 Internet 邮件扩展 (MIME) 内容类型和消息版本的实现,并可根据该内容类型定义对消息进行序列化和反序列化的接口。将其作为基类,用于编写您自己的自定义编码器)

重写 Encoder 以返回自定义 MessageEncoder 的实例。重写 CreateMessageEncoderFactory 方法以返回此工厂的实例。

MessageEncodingBindingElement 派生的任何类型负责更新为服务生成的 WSDL 文档中 SOAP 绑定的版本。实现 ExportEndpoint(WsdlExporter, WsdlEndpointConversionContext) 方法以修改生成的 WSDL,即可完成此操作。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值