2011-01-18 105 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)); 
     } 
    } 
相關問題