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 是一个基类,提供支持多用途 Internet 邮件扩展的实现, (MIME) 内容类型和邮件版本,并根据该内容类型定义邮件序列化和反序列化的接口。 将其作为基类,用于编写您自己的自定义编码器。

如果希望实现自定义消息编码器,请使用此类。 若要实现自己的自定义消息编码器,您必须提供下列抽象基类的自定义实现:

重写 Encoder 以返回自定义 MessageEncoder 的实例。 然后通过重写 MessageEncoderFactory 方法返回此工厂的实例,将自定义 CreateMessageEncoderFactory 连接到用于配置服务或客户端的绑定元素堆栈。

在消息的内存表示形式和可以写入流中的 XML 信息集 (Infoset) 表示形式之间进行转换的任务被包装到 MessageEncoder 类中,该类通常作为支持特定类型 XML 编码的 XML 读取器和 XML 编写器的工厂。

MessageEncoder 的主要方法包括 WriteMessageReadMessageWriteMessage 采用 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)

在派生类中重写时,从指定的缓冲区中读取一条消息。

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)

在派生类中重写时,将消息写入指定的流中。

适用于