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 Information Set (Infoset) 表現の変換タスクは、MessageEncoder クラスにカプセル化されており、このクラスは、特定の種類の XML エンコーディングをサポートする XML リーダーおよび XML ライターに対するファクトリとして最も一般的に利用されます。

MessageEncoder の主要なメソッドは、WriteMessageReadMessage です。 WriteMessageMessage オブジェクトを受け取り、これを 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)

派生クラスでオーバーライドされた場合、指定したストリームにメッセージを書き込みます。

適用対象