每当标记有 MessageContract 属性的类的对象被序列化时,我看到它查找 [MessageBodyMember] 成员并在消息中的单独XML元素下序列化它们。无论如何直接序列化它们,跳过包装节点?
例如
[System.ServiceModel.MessageContractAttribute(IsWrapped = false)]
Class A
{
[MessageBodyMember]
public string MyMessage
{
get;
set;
}
}
当它被序列化时,它变为
<Body>
<MyMessage>....</MyMessage>
</Body>
但我希望它成为
<Body>
....
</Body>
我知道这可能是不合逻辑的。有什么建议吗?
答案 0 :(得分:0)
这应该这样做: -
[MessageBodyMember(Name="Body")]
答案 1 :(得分:0)
如果我正确理解了您的问题,您希望删除<MyMessage>
元素并在邮件正文中包含字符串。好吧,邮件合同对你不起作用。您可以删除消息协定的外部包装器,但不能删除单个成员的包装器。
您可以做的是基于您创建的Message
实例创建一个BodyWriter
对象,并且此正文编写器可以以其想要的任何形式编写输出XML。请参阅下面的代码以获取示例。
public class StackOverflow_7010654
{
[MessageContract(IsWrapped = false)]
public class MyMC
{
[MessageBodyMember]
public string MyMessage { get; set; }
}
public static void Test()
{
TypedMessageConverter tmc = TypedMessageConverter.Create(typeof(MyMC), "Action");
Message msg = tmc.ToMessage(new MyMC { MyMessage = "some string" }, MessageVersion.Soap11);
Console.WriteLine(msg); // message with the <MyMessage> element
Console.WriteLine();
msg = Message.CreateMessage(MessageVersion.Soap11, "Action", new MyBodyWriter());
Console.WriteLine(msg); // message without the <MyMessage> element
}
public class MyBodyWriter : BodyWriter
{
public MyBodyWriter() : base(true) { }
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
writer.WriteString("some string");
}
}
}