2010-09-20 5 views
0

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.

Répondre

0

Le format de message Web est contrôlé par WebHttpBehavior. Je suis intéressé si vous serez en mesure de le faire fonctionner sur net tcp.

+0

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. –

0

Aucune propriété ne peut être définie sur WebMessageEncodingBindingElement pour toujours sérialiser le message dans JSON. La raison en est que l'élément de codage recherche réellement un en-tête spécifique dans les messages sortants, et si l'en-tête est présent, il écrit ces messages dans JSON. Pour voir ce que je veux dire, consultez les implémentations de WebMessageEncondingBindingElement.WriteMessage (...) via Reflector ou un outil similaire.

Donc, vous avez deux options:

(1) Insérer l'en-tête sur tous vos messages sortants, peut-être en utilisant un message intercepteur

(2) Extrait des JsonMessageEncodingBindingElement (qui est privée), Renommez/réutilisez-le, et utilisez-le comme votre propre élément de liaison personnalisé. Voila!

Espérons que ça aide.

Questions connexes