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


MessageEncoder Класс

Определение

Кодировщик — это компонент, который используется для записи сообщений в поток и для чтения сообщений из потока.

public ref class MessageEncoder abstract
public abstract class MessageEncoder
type MessageEncoder = class
Public MustInherit Class MessageEncoder
Наследование
MessageEncoder

Примеры

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

public class CustomTextMessageEncoder : MessageEncoder
{
    private CustomTextMessageEncoderFactory factory;
    private XmlWriterSettings writerSettings;
    private string contentType;

    public CustomTextMessageEncoder(CustomTextMessageEncoderFactory factory)
    {
        this.factory = factory;

        this.writerSettings = new XmlWriterSettings();
        this.writerSettings.Encoding = Encoding.GetEncoding(factory.CharSet);
        this.contentType = string.Format("{0}; charset={1}",
            this.factory.MediaType, this.writerSettings.Encoding.HeaderName);
    }

    public override string ContentType
    {
        get
        {
            return this.contentType;
        }
    }

    public override string MediaType
    {
        get
        {
            return factory.MediaType;
        }
    }

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

    public override bool IsContentTypeSupported(string contentType)
    {
        if (base.IsContentTypeSupported(contentType))
        {
            return true;
        }
        if (contentType.Length == this.MediaType.Length)
        {
            return contentType.Equals(this.MediaType, StringComparison.OrdinalIgnoreCase);
        }
        else
        {
            if (contentType.StartsWith(this.MediaType, StringComparison.OrdinalIgnoreCase)
                && (contentType[this.MediaType.Length] == ';'))
            {
                return true;
            }
        }
        return false;
    }

    public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
    {
        byte[] msgContents = new byte[buffer.Count];
        Array.Copy(buffer.Array, buffer.Offset, msgContents, 0, msgContents.Length);
        bufferManager.ReturnBuffer(buffer.Array);

        MemoryStream stream = new MemoryStream(msgContents);
        return ReadMessage(stream, int.MaxValue);
    }

    public override Message ReadMessage(Stream stream, int maxSizeOfHeaders, string contentType)
    {
        XmlReader reader = XmlReader.Create(stream);
        return Message.CreateMessage(reader, maxSizeOfHeaders, this.MessageVersion);
    }

    public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
    {
        MemoryStream stream = new MemoryStream();
        XmlWriter writer = XmlWriter.Create(stream, this.writerSettings);
        message.WriteMessage(writer);
        writer.Close();

        byte[] messageBytes = stream.GetBuffer();
        int messageLength = (int)stream.Position;
        stream.Close();

        int totalLength = messageLength + messageOffset;
        byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
        Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);

        ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
        return byteArray;
    }

    public override void WriteMessage(Message message, Stream stream)
    {
        XmlWriter writer = XmlWriter.Create(stream, this.writerSettings);
        message.WriteMessage(writer);
        writer.Close();
    }

Комментарии

MessageEncoder — это базовый класс, который предоставляет реализации, поддерживающие тип контента и версию сообщения с несколькими расширениями электронной почты (MIME), а также определяет интерфейс для сериализации и десериализации сообщений в соответствии с этим типом контента. Используйте его в качестве базового класса для написания собственного пользовательского кодировщика.

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

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

Задача преобразования между представлением сообщения в памяти и представлением набора сведений XML (Infoset), которое можно записать в поток, инкапсулируется в MessageEncoder классе, который чаще всего служит фабрикой для средств чтения XML и записи XML, поддерживающих определенные типы кодировки XML.

Ключевые методы MessageEncoder используются WriteMessage и ReadMessage. WriteMessage Message принимает объект и записывает его в Stream объект. ReadMessage принимает объект и максимальный Stream размер заголовка Message и возвращает объект.

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

Имя Описание
MessageEncoder()

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

Свойства

Имя Описание
ContentType

При переопределении в производном классе получает тип контента MIME, используемый кодировщиком.

MediaType

При переопределении в производном классе получает значение типа носителя, используемое кодировщиком.

MessageVersion

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

Методы

Имя Описание
BeginWriteMessage(Message, Stream, AsyncCallback, Object)

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

EndWriteMessage(IAsyncResult)

Завершает запись сообщений для кодировщика сообщений.

Equals(Object)

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

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

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

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

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

GetType()

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

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

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

MemberwiseClone()

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

(Унаследовано от Object)
ReadMessage(ArraySegment<Byte>, BufferManager, String)

При переопределении в производном классе считывает сообщение из указанного потока.

ReadMessage(ArraySegment<Byte>, BufferManager)

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

ReadMessage(Stream, Int32, String)

При переопределении в производном классе считывает сообщение из указанного потока.

ReadMessage(Stream, Int32)

При переопределении в производном классе считывает сообщение из указанного потока.

ReadMessageAsync(ArraySegment<Byte>, BufferManager, String)

Кодировщик — это компонент, который используется для записи сообщений в поток и для чтения сообщений из потока.

ReadMessageAsync(Stream, Int32, String)

Кодировщик — это компонент, который используется для записи сообщений в поток и для чтения сообщений из потока.

ToString()

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

WriteMessage(Message, Int32, BufferManager, Int32)

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

WriteMessage(Message, Int32, BufferManager)

Записывает сообщение меньше указанного размера в буфер массива байтов.

WriteMessage(Message, Stream)

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

WriteMessageAsync(Message, Int32, BufferManager, Int32)

Кодировщик — это компонент, который используется для записи сообщений в поток и для чтения сообщений из потока.

WriteMessageAsync(Message, Stream)

Кодировщик — это компонент, который используется для записи сообщений в поток и для чтения сообщений из потока.

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