[WCF REST] Web HTTP编程模型——WebHttpBinding(2)

发表于:2012-02-09来源:博客园作者:Artech点击数: 标签:Web HTTP编程模型
11: public override MessageVersion MessageVersion { get; set; } 12: public XmlDictionaryReaderQuotas ReaderQuotas { get; } 13: public Encoding WriteEncoding { get; set; } 14: } 除此之外,WebMessa

  11: public override MessageVersion MessageVersion { get; set; }

  12: public XmlDictionaryReaderQuotas ReaderQuotas { get; }

  13: public Encoding WriteEncoding { get; set; }

  14: }

  除此之外,WebMessageEncodingBindingElement具有CrossDomainScriptAccessEnabled 和ContentTypeMapper这两个重要的属性。前者表示是否支持跨域(Corss-Domain)脚本访问,默认值为False。后者类型为WebContentTypeMapper。WebContentTypeMapper用于进行消息的内容类型(Content Type,有时候也成为媒体类型或者MIME类型)与具体的格式(比如XML、JSON等)之间的映射。

  1: public abstract class WebContentTypeMapper

  2: {

  3: protected WebContentTypeMapper();

  4: public abstract WebContentFormat GetMessageFormatForContentType(string contentType);

  6: }

  7: public enum WebContentFormat

  8: {

  9: Default,

  10: Xml,

  11: Json,

  12: Raw

  13: }

  如上面的代码所示,WebContentTypeMapper是一个抽象类,包含的唯一的抽象方法GetMessageFormatForContentType用于根据指定的内容类型返回与之匹配的通过枚举WebContentFormat表示的内容格式。WebContentFormat枚举的Xml、JSON和Raw体现了Web HTTP编程模型支持三种基本格式,其中Raw表示原始的二进制。

  最终的消息编码/解码工作是通过继承自MessageEncoder的消息编码器实现的,消息编码器又是通过继承自MessageEncoderFactory的编码器工厂创建出来的,而消息编码绑定元素最终通过方法CreateMessageEncoderFactory创建了编码器工厂。对于WebMessageEncodingBindingElement来说,它的CreateMessageEncoderFactory方法会创建一个具有如下定义的WebMessageEncoderFactory对象。

  1: internal class WebMessageEncoderFactory : MessageEncoderFactory

  2: {

  3: public WebMessageEncoderFactory(Encoding writeEncoding, int maxReadPoolSize,int maxWritePoolSize, XmlDictionaryReaderQuotas quotas,

  4: WebContentTypeMapper contentTypeMapper, bool javascriptCallbackEnabled);

  5: public override MessageEncoder Encoder { get; }

  6: public override MessageVersion MessageVersion { get; }

  7: }

  8:

  WebMessageEncoderFactory是一个继承自MessageEncoderFactory的内部类型。除了布尔类型的参数javascriptCallbackEnabled对应着WebMessageEncodingBindingElement的属性CrossDomainScriptAccessEnabled之外,WebMessageEncoderFactory的构造函数参数与WebMessageEncodingBindingElement的同名属性一一对应。代表消息版本的MessageVersion属性依然返回None,而真正用于最终消息编码/解码工作的是通过Encoder属性返回的具有如下定义的WebMessageEncoder对象。

  1: internal class WebMessageEncoderFactory : MessageEncoderFactory

  2: {

  3: private class WebMessageEncoder : MessageEncoder

  4: {

  5: //其他成员

  6: private MessageEncoder TextMessageEncoder { get; }

  7: private MessageEncoder JsonMessageEncoder { get; }

  8: private MessageEncoder RawMessageEncoder { get; }

  9: }

  10: }

  如上面的代码片断所示,WebMessageEncoder实际上是内嵌于WebMessageEncoderFactory类型中继承自MessageEncoder的内部类型。WebMessageEncoder本身并不真正地实施消息的编码/解码,最终的消息编码/解码工作是通过三个属性TextMessageEncoder、JsonMessageEncoder和RawMessageEncoder体现的具体消息编码器完成的,而它们又分别对应着通过WebContentFormat枚举表示的三种内容类型Xml、JSON和Raw。

原文转自:http://www.ltesting.net