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 是基類,提供支援多重用途因特網郵件延伸模組的實作, (MIME) 內容類型和訊息版本,並根據該內容類型定義訊息串行化和還原串行化的介面。 您可以使用它做為撰寫您自己的自訂編碼器的基底類別。
如果您想要實作自訂訊息編碼器,請使用這個類別。 若要實作您自己的自訂訊息編碼器,您必須提供下列抽象基底類別的自訂實作:
覆寫 Encoder,以傳回自訂 MessageEncoder 的執行個體。 然後讓自訂 MessageEncoderFactory 連接用來設定服務或用戶端的繫結項目堆疊,其方式是覆寫 CreateMessageEncoderFactory 方法來傳回此處理站的執行個體。
記憶體內的訊息表示以及可寫入資料流的 XML 資訊集 (Infoset) 表示兩者間的轉換工作是封裝在 MessageEncoder 類別中,這個類別最常當做可支援特定類型 XML 編碼之 XML 讀取器和 XML 寫入器的處理站使用。
MessageEncoder 上的主要方法是 WriteMessage 和 ReadMessage。 WriteMessage 會接受 Message 物件,並將它寫入至 Stream 物件。 ReadMessage Stream會接受 對象和標頭大小上限,並傳Message回 物件。
建構函式
MessageEncoder() |
初始化 MessageEncoder 類別的新執行個體。 |
屬性
ContentType |
在衍生類別 (Derived Class) 中覆寫時,會取得編碼器使用的 MIME 內容類型。 |
MediaType |
在衍生類別中覆寫時,會取得編碼器使用的媒體類型值。 |
MessageVersion |
在衍生類別中覆寫時,會取得編碼器使用的訊息版本值。 |