MessageEncoder Classe

Definizione

Il codificatore è il componente usato per scrivere messaggi in un flusso e leggere messaggi da un flusso.

public ref class MessageEncoder abstract
public abstract class MessageEncoder
type MessageEncoder = class
Public MustInherit Class MessageEncoder
Ereditarietà
MessageEncoder

Esempio

Nel codice seguente viene illustrato un esempio di una classe derivata da 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();
    }

Commenti

MessageEncoder è una classe base che fornisce implementazioni che supportano un tipo di contenuto MIME (Multipurpose Internet Mail Extensions) e la versione del messaggio e definisce l'interfaccia per la serializzazione e la deserializzazione dei messaggi in base a tale tipo di contenuto. Utilizzare questa classe come classe di base per la scrittura di un codificatore personalizzato.

Utilizzare questa classe se si desidera implementare un codificatore di messaggi personalizzato. Per implementare un codificatore di messaggi personalizzato, è necessario fornire implementazioni personalizzate delle classi base astratte seguenti:

Eseguire l'override di Encoder per restituire un'istanza del codificatore MessageEncoder personalizzato. Associare quindi il MessageEncoderFactory personalizzato allo stack dell'elemento di associazione utilizzato per configurare il servizio o il client eseguendo l'override del metodo CreateMessageEncoderFactory per restituire un'istanza di questa factory.

La conversione tra la rappresentazione in memoria di un messaggio e la rappresentazione InfoSet XML che può essere scritta in un flusso viene incapsulata all'interno della classe MessageEncoder, che viene in genere utilizzata come una factory per i lettori e i writer XML che supportano tipi specifici di codifiche XML.

I metodi principali inclusi nella classe MessageEncoder sono WriteMessage e ReadMessage. WriteMessage accetta un oggetto Message e lo scrive in un oggetto Stream. ReadMessage accetta un Stream oggetto e una dimensione massima dell'intestazione e restituisce un Message oggetto .

Costruttori

MessageEncoder()

Inizializza una nuova istanza della classe MessageEncoder.

Proprietà

ContentType

Quando sottoposto a override in una classe derivata, ottiene il tipo di contenuto MIME utilizzato dal codificatore.

MediaType

Quando sottoposto a override in una classe derivata, ottiene il valore del tipo di supporto utilizzato dal codificatore.

MessageVersion

Quando sottoposto a override in una classe derivata, ottiene il valore della versione messaggi utilizzato dal codificatore.

Metodi

BeginWriteMessage(Message, Stream, AsyncCallback, Object)

Avvia la scrittura del messaggio per il codificatore di messaggi con il messaggio, il flusso, il callback e lo stato specificati.

EndWriteMessage(IAsyncResult)

Termina la scrittura dei messaggi per il codificatore di messaggi.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetProperty<T>()

Se presente, restituisce un oggetto tipizzato richiesto dal livello appropriato nello stack dei canali.

GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
IsContentTypeSupported(String)

Restituisce un valore che indica se il codificatore messaggi supporta un valore Content-Type a livello di messaggio specificato.

MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ReadMessage(ArraySegment<Byte>, BufferManager)

Quando sottoposto a override in una classe derivata, legge un messaggio da un buffer specificato.

ReadMessage(ArraySegment<Byte>, BufferManager, String)

Quando sottoposto a override in una classe derivata, legge un messaggio da un flusso specificato.

ReadMessage(Stream, Int32)

Quando sottoposto a override in una classe derivata, legge un messaggio da un flusso specificato.

ReadMessage(Stream, Int32, String)

Quando sottoposto a override in una classe derivata, legge un messaggio da un flusso specificato.

ToString()

Restituisce il tipo di contenuto utilizzato dal codificatore di messaggi.

WriteMessage(Message, Int32, BufferManager)

Scrive un messaggio di dimensione inferiore a quella specificata in un buffer di matrice di byte.

WriteMessage(Message, Int32, BufferManager, Int32)

Quando sottoposto a override in una classe derivata, scrive un messaggio di dimensione inferiore a quella specificata in un buffer di matrice di byte in corrispondenza dell'offset specificato.

WriteMessage(Message, Stream)

Quando sottoposto a override in una classe derivata, scrive un messaggio in un flusso specificato.

Si applica a