2010-09-20 50 views
0

我創建了一個自定義綁定(主要用於最初的診斷目的),通過編程方式更改WCF消息的編碼方式。這裏是什麼樣子:如何以編程方式配置綁定以強制WCF消息的JSON編碼?

public class ConfigurableNetTcpBinding : Binding 
{ 
    public enum MessageEncoding 
    { 
     Text, 
     Binary, 
     MTOM, 
     ByteStream, 
     JSON, 
    }; 

    private TcpTransportBindingElement transport; 
    private MessageEncodingBindingElement encoding; 
    public ConfigurableNetTcpBinding(MessageEncoding encoding = MessageEncoding.Binary, bool enableMessageCounters = false) 
     : base() 
    { 
     EnableMessageCounters = enableMessageCounters; 
     Encoding = encoding; 
     this.Initialize(); 
    } 

    public override BindingElementCollection CreateBindingElements() 
    { 
     BindingElementCollection elements = new BindingElementCollection(); 
     elements.Add(this.encoding); 
     elements.Add(this.transport); 
     return elements; 
    } 
    public override string Scheme 
    { 
     get { return this.transport.Scheme; } 
    } 

    public long MaxReceivedMessageSize 
    { 
     get { return transport.MaxReceivedMessageSize; } 
     set { transport.MaxReceivedMessageSize = value; } 
    } 

    public TransferMode TransferMode 
    { 
     get { return transport.TransferMode; } 
     set { transport.TransferMode = value; } 
    } 

    public MessageEncoding Encoding { get; private set; } 

    public bool EnableMessageCounters { get; private set; } 

    private void Initialize() 
    { 
     MessageEncodingBindingElement messageEncoder; 
     switch (Encoding) 
     { 
      default: 
      case MessageEncoding.Text: 
       messageEncoder = new TextMessageEncodingBindingElement(); 
       break; 

      case MessageEncoding.Binary: 
       messageEncoder = new BinaryMessageEncodingBindingElement(); 
       break; 

      case MessageEncoding.MTOM: 
       messageEncoder = new MtomMessageEncodingBindingElement(); 
       break; 

      case MessageEncoding.ByteStream: 
       messageEncoder = new ByteStreamMessageEncodingBindingElement(); 
       break; 

      case MessageEncoding.JSON: 
       WebMessageEncodingBindingElement webEncoder = new WebMessageEncodingBindingElement(); 
       // Um... what goes here to to configure the webEncoder to serialize with JSON vs POX 
       messageEncoder = webEncoder; 
       break; 
     } 

     transport = new TcpTransportBindingElement(); 
     encoding = EnableMessageCounters ? new CountingEncoderBindingElement(messageEncoder) : messageEncoder; 
    } 
} 

忽略CountingEncoderBindingElement ......它只是對線計數字節的包裝。基本上,我想弄清楚如何配置WebMessageEncodingBindingElement,以便它始終將消息序列化爲JSON。我錯過了什麼?所有MSDN Docs都說這是用於JSON編碼的編碼元素,文檔說使用Encoding構造函數來設置該模式,但Encoding沒有用於JSON的任何選項......它都是關於Unicode的。

回答

0

Web消息格式由WebHttpBehavior控制。我感興趣的是,如果你能夠使它通過網絡TCP工作。

+0

有趣。不應該有關於消息編碼格式的任何特定於http的東西......至少我不希望:)我會繼續挖掘,如果有人不打我,它一定會發布解決方案。 – 2010-09-21 13:09:10

0

沒有屬性可以在WebMessageEncodingBindingElement上設置爲始終將消息序列化爲JSON。原因在於編碼元素實際上在傳出消息中查找某個標題,並且如果標題存在,它會將這些消息寫入JSON。

要了解我的意思,請通過Reflector或類似工具查看WebMessageEncondingBindingElement.WriteMessage(...)的實現。

所以,你這裏有兩種選擇:

(1)將您的所有外發郵件的標題,也許是使用消息攔截

(2)提取出JsonMessageEncodingBindingElement(這是私人)重命名/重用它,並將其用作您自己的自定義綁定元素。瞧!

希望有所幫助。