Compartilhar via


MessageEncoder Classe

Definição

O codificador é o componente usado para gravar mensagens em um fluxo e ler mensagens de um fluxo.

public ref class MessageEncoder abstract
public abstract class MessageEncoder
type MessageEncoder = class
Public MustInherit Class MessageEncoder
Herança
MessageEncoder

Exemplos

O código a seguir mostra um exemplo de uma classe derivada de 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();
    }

Comentários

MessageEncoder é uma classe base que fornece implementações que dão suporte a um tipo de conteúdo MIME (Extensão de Internet multiuso) e à versão da mensagem e define a interface para a serialização e desserialização de mensagens de acordo com esse tipo de conteúdo. Use-a como uma classe base para escrever seu próprio codificador personalizado.

Use essa classe se quiser implementar um codificador de mensagens personalizado. Para implementar seu próprio codificador de mensagens personalizado, você deve fornecer implementações personalizadas das seguintes classes base abstratas:

Substitua Encoder para retornar uma instância do seu MessageEncoder personalizado. Em seguida, conecte seu personalizado MessageEncoderFactory à pilha de elementos de associação usada para configurar o serviço ou o cliente substituindo o CreateMessageEncoderFactory método para retornar uma instância desta fábrica.

A tarefa de converter entre a representação na memória de uma mensagem e uma representação do Conjunto de Informações XML (Infoset) que pode ser gravada em um fluxo é encapsulada dentro da MessageEncoder classe, que geralmente serve como uma fábrica para leitores XML e gravadores XML que dão suporte a tipos específicos de codificações XML.

Os principais métodos são MessageEncoderWriteMessage e ReadMessage. WriteMessage usa um Message objeto e o grava em um Stream objeto. ReadMessage usa um Stream objeto e um tamanho máximo de cabeçalho e retorna um Message objeto.

Construtores

Nome Description
MessageEncoder()

Inicializa uma nova instância da classe MessageEncoder.

Propriedades

Nome Description
ContentType

Quando substituído em uma classe derivada, obtém o tipo de conteúdo MIME usado pelo codificador.

MediaType

Quando substituído em uma classe derivada, obtém o valor de tipo de mídia usado pelo codificador.

MessageVersion

Quando substituído em uma classe derivada, obtém o valor da versão da mensagem que é usado pelo codificador.

Métodos

Nome Description
BeginWriteMessage(Message, Stream, AsyncCallback, Object)

Inicia a gravação da mensagem para o codificador de mensagens com mensagem, fluxo, retorno de chamada e estado especificados.

EndWriteMessage(IAsyncResult)

Encerra a gravação de mensagens para o codificador de mensagens.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetProperty<T>()

Retorna um objeto digitado solicitado, se presente, da camada apropriada na pilha do canal.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
IsContentTypeSupported(String)

Retorna um valor que indica se há suporte para um valor de tipo de conteúdo no nível de mensagem especificado pelo codificador de mensagens.

MemberwiseClone()

Cria uma cópia superficial do Objectatual.

(Herdado de Object)
ReadMessage(ArraySegment<Byte>, BufferManager, String)

Quando substituído em uma classe derivada, lê uma mensagem de um fluxo especificado.

ReadMessage(ArraySegment<Byte>, BufferManager)

Quando substituído em uma classe derivada, lê uma mensagem de um buffer especificado.

ReadMessage(Stream, Int32, String)

Quando substituído em uma classe derivada, lê uma mensagem de um fluxo especificado.

ReadMessage(Stream, Int32)

Quando substituído em uma classe derivada, lê uma mensagem de um fluxo especificado.

ReadMessageAsync(ArraySegment<Byte>, BufferManager, String)

O codificador é o componente usado para gravar mensagens em um fluxo e ler mensagens de um fluxo.

ReadMessageAsync(Stream, Int32, String)

O codificador é o componente usado para gravar mensagens em um fluxo e ler mensagens de um fluxo.

ToString()

Retorna o tipo de conteúdo usado pelo codificador de mensagens.

WriteMessage(Message, Int32, BufferManager, Int32)

Quando substituído em uma classe derivada, grava uma mensagem de menor que um tamanho especificado em um buffer de matriz de bytes no deslocamento especificado.

WriteMessage(Message, Int32, BufferManager)

Grava uma mensagem menor que um tamanho especificado em um buffer de matriz de bytes.

WriteMessage(Message, Stream)

Quando substituído em uma classe derivada, grava uma mensagem em um fluxo especificado.

WriteMessageAsync(Message, Int32, BufferManager, Int32)

O codificador é o componente usado para gravar mensagens em um fluxo e ler mensagens de um fluxo.

WriteMessageAsync(Message, Stream)

O codificador é o componente usado para gravar mensagens em um fluxo e ler mensagens de um fluxo.

Aplica-se a