在序列化“MessageBodyMember”属性时跳过元素

时间:2011-08-10 12:19:10

标签: c# wcf web-services soap xml-serialization

每当标记有 MessageContract 属性的类的对象被序列化时,我看到它查找 [MessageBodyMember] 成员并在消息中的单独XML元素下序列化它们。无论如何直接序列化它们,跳过包装节点?

例如

[System.ServiceModel.MessageContractAttribute(IsWrapped = false)]
Class A
{
        [MessageBodyMember]
        public string MyMessage
        {
            get;
            set;
        }
}

当它被序列化时,它变为

<Body>
<MyMessage>....</MyMessage>
</Body>

但我希望它成为

<Body>
....
</Body>

我知道这可能是不合逻辑的。有什么建议吗?

2 个答案:

答案 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");
        }
    }
}