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。