MessageEncodingBindingElement Класс

Определение

Элемент привязки, задающий версию сообщения, которая используется для кодирования сообщений.

public ref class MessageEncodingBindingElement abstract : System::ServiceModel::Channels::BindingElement
public abstract class MessageEncodingBindingElement : System.ServiceModel.Channels.BindingElement
type MessageEncodingBindingElement = class
    inherit BindingElement
Public MustInherit Class MessageEncodingBindingElement
Inherits BindingElement
Наследование
MessageEncodingBindingElement
Производный

Примеры

В следующем примере кода показано, как реализовать класс, производный от класса MessageEncodingBindingElement.

public class CustomTextMessageBindingElement : MessageEncodingBindingElement, IWsdlExportExtension
{
    private MessageVersion msgVersion;
    private string mediaType;
    private string encoding;
    private XmlDictionaryReaderQuotas readerQuotas;

    CustomTextMessageBindingElement(CustomTextMessageBindingElement binding)
        : this(binding.Encoding, binding.MediaType, binding.MessageVersion)
    {
        this.readerQuotas = new XmlDictionaryReaderQuotas();
        binding.ReaderQuotas.CopyTo(this.readerQuotas);
    }

    public CustomTextMessageBindingElement(string encoding, string mediaType,
        MessageVersion msgVersion)
    {
        if (encoding == null)
            throw new ArgumentNullException(nameof(encoding));

        if (mediaType == null)
            throw new ArgumentNullException(nameof(mediaType));

        if (msgVersion == null)
            throw new ArgumentNullException(nameof(msgVersion));

        this.msgVersion = msgVersion;
        this.mediaType = mediaType;
        this.encoding = encoding;
        this.readerQuotas = new XmlDictionaryReaderQuotas();
    }

    public CustomTextMessageBindingElement(string encoding, string mediaType)
        : this(encoding, mediaType, MessageVersion.Soap11WSAddressing10)
    {
    }

    public CustomTextMessageBindingElement(string encoding)
        : this(encoding, "text/xml")
    {
    }

    public CustomTextMessageBindingElement()
        : this("UTF-8")
    {
    }

    public override MessageVersion MessageVersion
    {
        get
        {
            return this.msgVersion;
        }

        set
        {
            if (value == null)
                throw new ArgumentNullException(nameof(value));
            this.msgVersion = value;
        }
    }

    public string MediaType
    {
        get
        {
            return this.mediaType;
        }

        set
        {
            if (value == null)
                throw new ArgumentNullException(nameof(value));
            this.mediaType = value;
        }
    }

    public string Encoding
    {
        get
        {
            return this.encoding;
        }

        set
        {
            if (value == null)
                throw new ArgumentNullException(nameof(value));
            this.encoding = value;
        }
    }

    // This encoder does not enforces any quotas for the unsecure messages. The
    // quotas are enforced for the secure portions of messages when this encoder
    // is used in a binding that is configured with security.
    public XmlDictionaryReaderQuotas ReaderQuotas
    {
        get
        {
            return this.readerQuotas;
        }
    }

    #region IMessageEncodingBindingElement Members
    public override MessageEncoderFactory CreateMessageEncoderFactory()
    {
        return new CustomTextMessageEncoderFactory(this.MediaType,
            this.Encoding, this.MessageVersion);
    }

    #endregion

    public override BindingElement Clone()
    {
        return new CustomTextMessageBindingElement(this);
    }

    public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
    {
        if (context == null)
            throw new ArgumentNullException(nameof(context));

        context.BindingParameters.Add(this);
        return context.BuildInnerChannelFactory<TChannel>();
    }

    public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
    {
        if (context == null)
            throw new ArgumentNullException(nameof(context));

        return context.CanBuildInnerChannelFactory<TChannel>();
    }

    public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
    {
        if (context == null)
            throw new ArgumentNullException(nameof(context));

        context.BindingParameters.Add(this);
        return context.BuildInnerChannelListener<TChannel>();
    }

    public override bool CanBuildChannelListener<TChannel>(BindingContext context)
    {
        if (context == null)
            throw new ArgumentNullException(nameof(context));

        context.BindingParameters.Add(this);
        return context.CanBuildInnerChannelListener<TChannel>();
    }

    public override T GetProperty<T>(BindingContext context)
    {
        if (typeof(T) == typeof(XmlDictionaryReaderQuotas))
        {
            return (T)(object)this.readerQuotas;
        }
        else
        {
            return base.GetProperty<T>(context);
        }
    }

    #region IWsdlExportExtension Members

    void IWsdlExportExtension.ExportContract(WsdlExporter exporter, WsdlContractConversionContext context)
    {
    }

    void IWsdlExportExtension.ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context)
    {
        // The MessageEncodingBindingElement is responsible for ensuring that the WSDL has the correct
        // SOAP version. We can delegate to the WCF implementation of TextMessageEncodingBindingElement for this.
        TextMessageEncodingBindingElement mebe = new TextMessageEncodingBindingElement();
        mebe.MessageVersion = this.msgVersion;
        ((IWsdlExportExtension)mebe).ExportEndpoint(exporter, context);
    }

    #endregion
}

Комментарии

Кодирование — это процесс преобразования сообщения в последовательность байтов. Декодирование представляет собой обратный процесс. В Windows Communication Foundation (WCF) имеется три типа кодирования для сообщений SOAP: Text, Binary и MTOM.

Используйте этот класс, если необходимо реализовать пользовательский кодировщик сообщений. Чтобы реализовать собственный пользовательский кодировщик сообщений, необходимо предоставить пользовательские реализации следующих трех абстрактных базовых классов.

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

Любой тип, унаследованный от класса MessageEncodingBindingElement, отвечает за обновление версии привязки протокола SOAP в документе WSDL, созданном для службы. Это выполняется реализацией метода ExportEndpoint(WsdlExporter, WsdlEndpointConversionContext) для изменения созданного кода WSDL.

Windows Communication Foundation (WCF) предоставляет три типа элементов привязки, производных от MessageEncodingBindingElement класса , которые могут обеспечить текстовое, двоичное кодирование и механизм оптимизации передачи сообщений (MTOM).

  • TextMessageEncodingBindingElement. Кодировщик для сообщений XML с наиболее широкими возможностями взаимодействия, но при этом наименее эффективный. Веб-служба или клиент веб-службы в общем могут понимать XML в текстовом виде. Однако передача больших блоков двоичных данных в виде текста неэффективна.

  • BinaryMessageEncodingBindingElement: представляет элемент привязки, указывающий кодировку символов и управление версиями сообщений, используемых для двоичных XML-сообщений. Этот вариант кодирования является наиболее эффективными, но обладает наименьшими возможностями взаимодействия.

  • MtomMessageEncodingBindingElement: представляет элемент привязки, указывающий кодировку символов и управление версиями сообщений, используемых для сообщения с использованием кодировки MTOM. MTOM - это эффективный способ передачи двоичных данных в сообщениях WCF. Кодировщик MTOM пытается обеспечить баланс между эффективностью и возможностями взаимодействия. Кодирование MTOM передает большую часть XML-данных в текстовой форме, но оптимизирует большие блоки двоичных данных путем передачи их в исходном виде, без преобразования в текст.

Конструкторы

MessageEncodingBindingElement()

Инициализирует новый экземпляр класса MessageEncodingBindingElement.

MessageEncodingBindingElement(MessageEncodingBindingElement)

Инициализирует новый экземпляр класса MessageEncodingBindingElement, инициализированного из существующего элемента.

Свойства

MessageVersion

При переопределении в производном классе возвращает или задает версию сообщения, которая может обрабатываться кодировщиками сообщений, созданными фабрикой кодировщиков сообщений.

Методы

BuildChannelFactory<TChannel>(BindingContext)

Инициализирует фабрику каналов для создания каналов заданного типа из контекста привязок.

(Унаследовано от BindingElement)
BuildChannelListener<TChannel>(BindingContext)

Инициализирует прослушиватель каналов для приема каналов заданного типа из контекста привязки.

(Унаследовано от BindingElement)
CanBuildChannelFactory<TChannel>(BindingContext)

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

(Унаследовано от BindingElement)
CanBuildChannelListener<TChannel>(BindingContext)

Возвращает значение, показывающее, может ли элемент привязки создать прослушиватель для заданного типа канала.

(Унаследовано от BindingElement)
Clone()

При переопределении в производном классе возвращает копию объекта элемента привязки.

(Унаследовано от BindingElement)
CreateMessageEncoderFactory()

При переопределении в производном классе создает фабрику для создания кодировщиков сообщений.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetProperty<T>(BindingContext)

Возвращает запрошенный типизированный объект, если он имеется, из соответствующего уровня стека каналов.

GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к