MessageEncoder Klasa

Definicja

Koder to składnik używany do zapisywania komunikatów w strumieniu i odczytywania komunikatów ze strumienia.

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

Przykłady

Poniższy kod przedstawia przykład klasy, która pochodzi z MessageEncoderklasy .

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

Uwagi

MessageEncoder jest klasą bazową, która udostępnia implementacje obsługujące typ zawartości i wersję komunikatów rozszerzeń poczty internetowej (Multipurpose Internet Mail Extensions, Multipurpose Internet Mail Extensions) i definiuje interfejs serializacji i deserializacji komunikatów zgodnie z tym typem zawartości. Użyj go jako klasy bazowej do pisania własnego kodera niestandardowego.

Użyj tej klasy, jeśli chcesz zaimplementować niestandardowy koder komunikatów. Aby zaimplementować własny niestandardowy koder komunikatów, należy podać niestandardowe implementacje następujących abstrakcyjnych klas bazowych:

Zastąpij element , Encoder aby zwrócić wystąpienie niestandardowego MessageEncoderelementu . Następnie podłączanie MessageEncoderFactory niestandardowego stosu elementu powiązania używanego do konfigurowania usługi lub klienta przez zastąpienie CreateMessageEncoderFactory metody w celu zwrócenia wystąpienia tej fabryki.

Zadanie konwersji między reprezentacją w pamięci komunikatu i reprezentacją zestawu informacji XML (Infoset), które można zapisać w strumieniu, jest hermetyzowane w MessageEncoder klasie, która najczęściej służy jako fabryka dla czytników XML i pisarzy XML, które obsługują określone typy kodowania XML.

Kluczowe metody MessageEncoder to WriteMessage i ReadMessage. WriteMessageMessage pobiera obiekt i zapisuje go w Stream obiekcie. ReadMessageStream przyjmuje obiekt i maksymalny rozmiar nagłówka Message i zwraca obiekt.

Konstruktory

MessageEncoder()

Inicjuje nowe wystąpienie klasy MessageEncoder.

Właściwości

ContentType

Po zastąpieniu w klasie pochodnej pobiera typ zawartości MIME używany przez koder.

MediaType

Po przesłonięciu w klasie pochodnej pobiera wartość typu nośnika, która jest używana przez koder.

MessageVersion

Po zastąpieniu w klasie pochodnej pobiera wartość wersji komunikatu, która jest używana przez koder.

Metody

BeginWriteMessage(Message, Stream, AsyncCallback, Object)

Uruchamia pisanie komunikatu dla kodera komunikatów z określonym komunikatem, strumieniem, wywołaniem zwrotnym i stanem.

EndWriteMessage(IAsyncResult)

Kończy pisanie komunikatów dla kodera komunikatów.

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetProperty<T>()

Zwraca żądany obiekt typu z odpowiedniej warstwy w stosie kanału.

GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
IsContentTypeSupported(String)

Zwraca wartość wskazującą, czy określona wartość typu zawartości na poziomie komunikatu jest obsługiwana przez koder komunikatów.

MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
ReadMessage(ArraySegment<Byte>, BufferManager)

Po przesłonięciu w klasie pochodnej odczytuje komunikat z określonego buforu.

ReadMessage(ArraySegment<Byte>, BufferManager, String)

Po przesłonięciu w klasie pochodnej odczytuje komunikat z określonego strumienia.

ReadMessage(Stream, Int32)

Po przesłonięciu w klasie pochodnej odczytuje komunikat z określonego strumienia.

ReadMessage(Stream, Int32, String)

Po przesłonięciu w klasie pochodnej odczytuje komunikat z określonego strumienia.

ToString()

Zwraca typ zawartości używany przez koder komunikatów.

WriteMessage(Message, Int32, BufferManager)

Zapisuje komunikat mniejszy niż określony rozmiar buforu tablicy bajtowej.

WriteMessage(Message, Int32, BufferManager, Int32)

Po przesłonięciu w klasie pochodnej zapisuje komunikat o rozmiarze mniejszym niż określony rozmiar do buforu tablicy bajtów w określonym przesunięciu.

WriteMessage(Message, Stream)

Gdy zastąpisz klasę pochodną, zapisuje komunikat do określonego strumienia.

Dotyczy