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

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

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

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

Основные методы MessageEncoder — это WriteMessage и ReadMessage. WriteMessage принимает объект Message и записывает его в объект Stream. ReadMessageStream принимает объект и максимальный размер заголовка и возвращает 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)

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

ReadMessage(ArraySegment<Byte>, BufferManager, String)

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

ReadMessage(Stream, Int32)

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

ReadMessage(Stream, Int32, String)

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

ToString()

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

WriteMessage(Message, Int32, BufferManager)

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

WriteMessage(Message, Int32, BufferManager, Int32)

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

WriteMessage(Message, Stream)

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

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