Je crée une liaison personnalisée (la plupart du temps à des fins de diagnostic) qui modifie par programmation le mode de codage des messages WCF. Voici à quoi il ressemble:Comment configurer la liaison par programmation pour forcer le codage JSON des messages WCF?
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;
}
}
ignorer les CountingEncoderBindingElement
... il est juste un wrapper pour compter octets sur le fil. Fondamentalement, j'essaye de comprendre comment configurer WebMessageEncodingBindingElement de sorte qu'il ait toujours sérialisé des messages comme JSON. Qu'est-ce que je rate? Tous les MSDN Docs disent que c'est l'élément de codage à utiliser pour le codage JSON et les docs disent d'utiliser le constructeur Encoding
pour définir ce mode, mais Encoding
n'a pas d'options pour JSON ... tout est sur Unicode.
Intéressant. Il ne devrait pas y avoir quelque chose de spécifique à http sur le format d'encodage des messages ... du moins j'espère pas :) Je vais continuer à creuser et je publierai sûrement la solution si quelqu'un ne me bat pas dessus. –