MessageEncoder Classe

Definição

O codificador é o componente usado para gravar e ler mensagens em 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ões de Internet Mail Multipurpose) 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-o 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 a Encoder para retornar uma instância do seu personalizado MessageEncoder. 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 dessa fábrica.

A tarefa de conversão 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 MessageEncoder WriteMessage 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

MessageEncoder()

Inicializa uma nova instância da classe MessageEncoder.

Propriedades

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 de versão de mensagem usado pelo codificador.

Métodos

BeginWriteMessage(Message, Stream, AsyncCallback, Object)

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

EndWriteMessage(IAsyncResult)

Termina a gravação de mensagens para o codificador de mensagem.

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 tipado solicitado, se presente, da camada apropriada na pilha de canais.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
IsContentTypeSupported(String)

Retorna um valor que indica se um valor de tipo de conteúdo de nível de mensagem especificado tem suporte no codificador de mensagem.

MemberwiseClone()

Cria uma cópia superficial do Object atual.

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

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

ReadMessage(ArraySegment<Byte>, BufferManager, 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.

ReadMessage(Stream, Int32, String)

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

ToString()

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

WriteMessage(Message, Int32, BufferManager)

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

WriteMessage(Message, Int32, BufferManager, Int32)

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

WriteMessage(Message, Stream)

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

Aplica-se a