技术开发 频道

使用定制WCF MessageEncoder进行编码


  将字节转换为Message
    下面的代码将装载一个流,并使用一个缓冲区管理将流复制到一个缓冲区中,最后调用TestMessageEncoder中的ReadMessage方法建立一个Message类。

buffer = mgr.TakeBuffer((int)streamFrom.Length); streamFrom.Read(buffer, 0, (int)streamFrom.Length); byteArray = new ArraySegment<byte>(buffer); msg = _encoder.ReadMessage(byteArray, mgr); ReadMessage的代码如下: public override Message ReadMessage(Stream stream, int maxSizeOfHeaders, string contentType) { Message msg; XmlDocument doc = new XmlDocument(); doc.Load(stream); TestBodyWriter bw = new TestBodyWriter(doc); msg = Message.CreateMessage(this.MessageVersion,"",bw); return (msg); }

 


    看了上面的代码,也许我们的第一个问题就是ArraySegment<byte>泛型类是什么?我们可以从.NET framework文档中可以看出,ArraySegment可以和Array类一起工作,并可以对数组的部分进行包装。

    我们现在可以注意到,Message类的CreateMessage方法提供很多建立Message类的方法。对于这一点,我们可以回顾本文提供的所有重载的CreateMessage方法。接下来我们将看到如何将Message类转换回字节。
七、将Message类转换为字节
    WriteMessage方法的功能的功能复制一个Message类到一个字节流中。下面是关于WriteMessage方法的实现代码:
public override void WriteMessage(Message message, Stream stream) { XmlWriter writer = XmlWriter.Create(stream); XmlDictionaryWriter xmlDW = XmlDictionaryWriter.CreateDictionaryWriter(writer); message.WriteBodyContents(xmlDW); xmlDW.Close(); }




上面的代码是一个典型的实现。我使用了XmlDictionalWriter类将Message类的数据写到一个流中。当我们建立一个Message类实例时,Message对象被写到流中。同时OnWriteBodyContents事件被调用。在本文的开始部分,BodyWriter被XmlDocument类包装,因此,可以简单地使用XmlDocument和XmlWriter来处理Message类的内容。

八、结论

    MessageEncoder有以下几个特性。
1.  MessageEncoder将在通道中传输的字节转换为WCF Message类。
2.  MessageEncoder一般存在于传输通道中。
3.  象很多WCF类一样,MessageEncoder也有binding和工厂类。
4.  对信息编码一般使用XmlReaders、XmlWriters以及.NET framework中和流有关的类。
0
相关文章