2011-01-18 68 views
2

我想使用DataContractSerializer序列化WCF消息以获取消息大小(不使用服务跟踪查看器)。以下是代码片段:如何使用DataContractSerializer序列化WCF消息?

public void BeforeSendReply(ref Message reply, object correlationState) 
     { 
      byte[] bytes = null; 
      var messageBuffer = reply.CreateBufferedCopy(Int32.MaxValue); 
      var message = messageBuffer.CreateMessage(); 
      var dcs = new DataContractSerializer(typeof(Message)); 
      using (var ms = new MemoryStream()) 
      { 
       dcs.WriteObject(ms, message); 
       bytes = ms.ToArray(); 
       Console.WriteLine(String.Format("Message size = {0}", bytes.Count())); 
      } 
     } 

在这样它会引发以下异常:

类型 'System.ServiceModel.Channels.BodyWriterMessage' 无法序列。使用 DataContractAttribute属性和 标记它的所有成员,并使用 DataMemberAttribute属性将其所有成员标记为 。如果 类型是一个集合,请考虑使用 CollectionDataDataContractAttribute将其标记为 。

可以做些什么?

+0

您正在使用什么版本的.NET?你能否确认你没有使用v3.5(不是SP1) – 2011-01-21 03:15:01

回答

0

如果您需要序列化它,您可以在创建状态的Message实例上调用WriteMessage(XmlWriter)

1

Message类不是数据协定类型或Xml串行器类型。 WCF特例它。要查找长度,您的代码应该看起来更像这样:

public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     var messageBuffer = reply.CreateBufferedCopy(Int32.MaxValue); 
     var message = messageBuffer.CreateMessage(); 

     using (var ms = new MemoryStream()) 
     { 
      var xw = XmlWriter.Create(ms); 
      message.WriteMessage(xw); 
      Console.WriteLine(String.Format("Message size = {0}", ms.Length)); 
     } 
    } 
相关问题