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 上的主要方法是 WriteMessageReadMessageWriteMessage 會接受 Message 物件,並將它寫入至 Stream 物件。 ReadMessageStream會接受 物件和標頭大小上限,並傳 Message 回 物件。

建構函式

MessageEncoder()

初始化 MessageEncoder 類別的新執行個體。

屬性

ContentType

在衍生類別 (Derived Class) 中覆寫時,會取得編碼器使用的 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)

在衍生類別中覆寫時,寫入訊息至指定的資料流中。

適用於