MessageEncoder Klasse

Definition

Der Encoder ist die Komponente, die zum Schreiben von Nachrichten in einen Stream und Lesen von Nachrichten aus einem Stream dient.

public ref class MessageEncoder abstract
public abstract class MessageEncoder
type MessageEncoder = class
Public MustInherit Class MessageEncoder
Vererbung
MessageEncoder

Beispiele

Im folgenden Codebeispiel wird eine vom MessageEncoder abgeleitete Klasse veranschaulicht.

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();
    }

Hinweise

MessageEncoder ist eine Basisklasse, die Implementierungen bereitstellt, die einen MULTIpurpose Internet Mail Extensions (MIME)-Inhaltstyp und die Nachrichtenversion unterstützen, und definiert die Schnittstelle für die Serialisierung und Deserialisierung von Nachrichten gemäß diesem Inhaltstyp. Verwenden Sie es als Basisklasse zum Schreiben eines eigenen benutzerdefinierten Encoders.

Mit dieser Klasse können Sie einen benutzerdefinierten Nachrichtenencoder implementieren. Zum Implementieren eines eigenen Nachrichtenencoders müssen benutzerdefinierte Implementierungen der folgenden abstrakten Basisklassen bereitgestellt werden:

Überschreiben Sie den Encoder, um eine Instanz des benutzerdefinierten MessageEncoder zurückzugeben. Verknüpfen Sie anschließend die benutzerdefinierte MessageEncoderFactory mit dem Bindungselementstapel für die Konfiguration des Diensts oder des Clients durch Überschreiben der CreateMessageEncoderFactory-Methode, um eine Instanz der Factory zurückzugeben.

Die Aufgabe zur Umwandlung der speicherinternen Version einer Nachricht und eines XML Information Set (Infoset) in eine Version, die in einen Stream geschrieben werden kann, ist Teil der MessageEncoder-Klasse, die als Factory für XML-Reader und XML-Writer mit Unterstützung für bestimmte XML-Codierungstypen fungiert.

Die Schlüsselmethoden für MessageEncoder sind WriteMessage und ReadMessage. WriteMessage nimmt ein Message-Objekt an und schreibt es in ein Stream-Objekt. ReadMessage verwendet ein Stream Objekt und eine maximale Kopfzeilengröße und gibt ein Message Objekt zurück.

Konstruktoren

MessageEncoder()

Initialisiert eine neue Instanz der MessageEncoder-Klasse.

Eigenschaften

ContentType

Beim Überschreiben in einer abgeleiteten Klasse wird der vom Encoder verwendete MIME-Inhaltstyp abgerufen.

MediaType

Beim Überschreiben in einer abgeleiteten Klasse wird der vom Encoder verwendete Medientypwert abgerufen.

MessageVersion

Beim Überschreiben in einer abgeleiteten Klasse wird die vom Encoder verwendete Nachrichtenversion abgerufen.

Methoden

BeginWriteMessage(Message, Stream, AsyncCallback, Object)

Beginnt mit dem Schreiben der Nachricht für den Nachrichtenencoder mit angegebener Nachricht, angegebenem Stream, Rückruf und Zustand.

EndWriteMessage(IAsyncResult)

Beendet das Schreiben von Meldungen für den Nachrichtenencoder.

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetProperty<T>()

Gibt ggf. ein angefordertes typisiertes Objekt von der entsprechenden Ebene im Kanalstapel zurück.

GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
IsContentTypeSupported(String)

Gibt einen Wert zurück, der anzeigt, ob ein angegebener Content-Type-Wert auf Nachrichtenebene vom Nachrichtenencoder unterstützt wird.

MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ReadMessage(ArraySegment<Byte>, BufferManager)

Liest beim Überschreiben in einer abgeleiteten Klasse eine Nachricht aus dem angegebenen Puffer.

ReadMessage(ArraySegment<Byte>, BufferManager, String)

Liest beim Überschreiben in einer abgeleiteten Klasse eine Nachricht aus dem angegebenen Stream.

ReadMessage(Stream, Int32)

Liest beim Überschreiben in einer abgeleiteten Klasse eine Nachricht aus dem angegebenen Stream.

ReadMessage(Stream, Int32, String)

Liest beim Überschreiben in einer abgeleiteten Klasse eine Nachricht aus dem angegebenen Stream.

ToString()

Der Inhaltstyp, der vom Nachrichtenencoder verwendet wird, wird zurückgegeben.

WriteMessage(Message, Int32, BufferManager)

Schreibt eine Nachricht, die kleiner ist als die angegebene Größe, in einen Bytearraypuffer.

WriteMessage(Message, Int32, BufferManager, Int32)

Schreibt beim Überschreiben in einer abgeleiteten Klasse eine Nachricht, die kleiner ist als die angegebene Größe, im angegebenen Offset in einen Bytearraypuffer.

WriteMessage(Message, Stream)

Schreibt beim Überschreiben in einer abgeleiteten Klasse eine Nachricht in den angegebenen Stream.

Gilt für