我正在尝试使用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属性。如果 typ e是一个集合,考虑一下 用它标记它 CollectionDataContractAttribute。
可以做些什么?
答案 0 :(得分:1)
Message类不是数据协定类型或Xml Serializer类型。 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));
}
}
答案 1 :(得分:0)
如果需要序列化,可以在Created状态的WriteMessage(XmlWriter)
实例上调用Message
。