MessageEncoder 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
编码器是用于将消息写入到流中并从流中读取消息的组件。
public ref class MessageEncoder abstract
public abstract class MessageEncoder
type MessageEncoder = class
Public MustInherit Class MessageEncoder
- 继承
-
MessageEncoder
示例
下面的代码演示一个派生自 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();
}
注解
MessageEncoder 是一个基类,它提供支持多用途 Internet 邮件扩展 (MIME) 内容类型和邮件版本的实现,并根据该内容类型定义消息的序列化和反序列化接口。 将其作为基类,用于编写您自己的自定义编码器。
如果希望实现自定义消息编码器,请使用此类。 若要实现自己的自定义消息编码器,您必须提供下列抽象基类的自定义实现:
重写 Encoder 以返回自定义 MessageEncoder 的实例。 然后通过重写 MessageEncoderFactory 方法返回此工厂的实例,将自定义 CreateMessageEncoderFactory 连接到用于配置服务或客户端的绑定元素堆栈。
在消息的内存表示形式和可以写入流中的 XML 信息集 (Infoset) 表示形式之间进行转换的任务被包装到 MessageEncoder 类中,该类通常作为支持特定类型 XML 编码的 XML 读取器和 XML 编写器的工厂。
MessageEncoder 的主要方法包括 WriteMessage 和 ReadMessage。 WriteMessage 采用 Message 对象,并将其写入到 Stream 对象。 ReadMessage Stream采用 对象和最大标头大小,并返回 Message 对象。
构造函数
MessageEncoder() |
初始化 MessageEncoder 类的新实例。 |
属性
ContentType |
在派生类中重写时,获取编码器使用的 MIME 内容类型。 |
MediaType |
在派生类中重写时,获取编码器使用的媒体类型值。 |
MessageVersion |
在派生类中重写时,获取编码器使用的消息版本值。 |