title: How to programatically configure binding to force JSON encoding of WCF messages?
body: <p>I'm creating a custom binding (mostly for diagnostic purposes initially) that programatically changes thw way WCF messages are encoded. Here's what it looks like:</p>
  
  <pre><code>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;
      }
  }
  </code></pre>
  
  <p>Ignore the <code>CountingEncoderBindingElement</code>... it's just a wrapper for counting bytes on the wire. Basically, I'm trying to figure out how to configure WebMessageEncodingBindingElement so that it always serialized messages as JSON. What am I missing? All the <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.webmessageencodingbindingelement.aspx" rel="nofollow noreferrer">MSDN Docs</a> say this is the encoding element to use for JSON encoding and the docs say to use the <code>Encoding</code> constructor to set that mode, but <code>Encoding</code> does not have any options for JSON... it's all about Unicode.</p>