Как программно настроить привязку для принудительного кодирования JSON сообщений WCF? - PullRequest
0 голосов
/ 21 сентября 2010

Я создаю пользовательскую привязку (в основном для диагностических целей), которая программно изменяет способ кодирования сообщений 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;
    }
}

Игнорировать CountingEncoderBindingElement ... это просто оболочка для подсчета байтов на проводе.По сути, я пытаюсь выяснить, как настроить WebMessageEncodingBindingElement, чтобы он всегда сериализовал сообщения как JSON.Что мне не хватает?Все документы MSDN говорят, что это элемент кодирования, который будет использоваться для кодирования JSON, а документы говорят, что для установки этого режима используется конструктор Encoding, но Encoding не имеет никаких параметров для JSON ..все дело в Юникоде.

Ответы [ 2 ]

0 голосов
/ 07 марта 2011

нет свойства, которое вы можете установить в WebMessageEncodingBindingElement, чтобы всегда сериализовать сообщение в JSON.Причина в том, что элемент кодирования фактически ищет определенный заголовок в исходящих сообщениях, и, если заголовок присутствует, он записывает эти сообщения в JSON.

Чтобы увидеть, что я имею в виду, ознакомьтесь с реализациямиWebMessageEncondingBindingElement.WriteMessage (...) через Reflector или аналогичный инструмент.

Итак, у вас есть две опции:

(1) Вставьте заголовок во все ваши исходящие сообщения, возможно, используя перехватчик сообщений

(2) Извлеките JsonMessageEncodingBindingElement(который является частным), переименуйте / повторно используйте его, и используйте его как свой собственный элемент привязки.Вуаля!

Надеюсь, это поможет.

0 голосов
/ 21 сентября 2010

Формат веб-сообщения контролируется WebHttpBehavior.Мне интересно, сможете ли вы заставить его работать через net tcp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...