Поделиться через


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: текстовый, двоичный и механизм оптимизации передачи сообщений (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 в текстовой форме, но оптимизирует большие блоки двоичных данных путем передачи их as-isбез преобразования в текст.

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

Имя Описание
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)

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