WCF序列化用类实现IXmlSerializable忽略XmlRoot名

本文关键字:忽略 XmlRoot IXmlSerializable 实现 序列化 WCF | 更新日期: 2023-09-27 18:18:01

下面是我的WCF服务类:

class MyService : IMyService
{
   public String GetService(MyRequest request){...}
}

下面是请求类:

[XmlRoot("RequestClass")]
class MyRequest : IXmlSerializable
{
    public String Id {get;set;}
    public String ReqContent {get;set;}
    public void ReadXml(XmlReader reader)
    {
        using (XmlReader rr = reader.ReadSubtree())
        {
            Id = ...;
            ReqContent = ...;
        }
    }
    public void WriteXml(XmlWriter writer)
    {
       // write customize format content to the writer
    }
}

使用下面的XmlSerializer实例测试了MyRequest类的序列化:

    StringBuilder xml = new StringBuilder();
    XmlSerializer ser = new XmlSerializer(typeof(MyRequest), "");
    using (XmlWriter writer = XmlWriter.Create(xml))
    {
        ser.Serialize(writer, req);
    }

,得到如下XML:

<RequestClass>
   <Id>123</Id>
   <ReqContent>...</ReqContest>
</RequestClass>

这里一切都好。但是,在应用WCF服务并将请求类传递给服务之后,ReadXml中得到的xml如下所示:

<request xmlns="http://tempuri.org/">
       <Id>123</Id>
       <ReqContent>...</ReqContest>
<request>

WCF序列化器替换类的根元素,我如何解决这个问题?

任何想法都是欢迎和感激的,我已经被这个问题困了好几天了。

PS1:我已经读了这篇文章,不知道如何解决这个问题。PS2:我不确定这是否是由我在项目中使用的ClearUsernameBinding引起的。如果是,如何在不改变绑定的情况下修复它?

WCF序列化用类实现IXmlSerializable忽略XmlRoot名

我认为你在PS1中提到的帖子中描述了所有内容。您应该决定您的服务是否是SOAP服务。如果是,您可以使用消息契约属性,而不是数据契约(实际上不使用数据契约)来完全控制消息契约。如果您想要XML序列化,您应该在服务契约中添加[XmlSerializerFormat]。参见数据契约XML序列化和XML属性

对于自定义序列化,您还可以实现自己的序列化器,并使用行为将其注入WCF管道。