You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6 Web API中WCF SOAP服务XML反序列化父子类同名字段问题

解决方案:.NET 6 WCF SOAP XML反序列化同名Values属性冲突问题

方案1:通过XmlAttribute明确区分基类与子类的属性映射

由于报错提示子类的Values属性隐藏了基类同名属性,核心是让XML序列化器能区分两者的映射关系。利用自动生成类的partial特性,创建扩展文件而非直接修改生成代码:

  1. 扩展基类DataValue,将原手动添加的string Values重命名并指定XML元素映射:
using System.Xml.Serialization;

public partial class DataValue
{
    // 映射XML中<string>类型的Values元素
    [XmlElement("Values", DataType = "string")]
    public string? StringValue { get; set; }
}
  1. 扩展子类IntegerValue,用new关键字覆盖并指定对应类型的XML映射:
public partial class IntegerValue
{
    // 映射XML中<long>类型的Values元素,避免与基类属性冲突
    [XmlElement("Values", DataType = "long")]
    public new long?[]? Values { get; set; }
}

方案2:重新生成WCF客户端代理类

自动生成的类缺失Values属性,可能是生成工具默认配置未适配WSDL中的XML结构。尝试调整生成参数重新生成:

  • 使用SvcUtil.exe命令,指定XmlSerializer(比DataContractSerializer更适配复杂XML结构):
svcutil.exe http://your-wcf-service-url?wsdl /out:ServiceReference.cs /config:App.config /serializer:XmlSerializer
  • 若使用Visual Studio添加服务引用,在高级选项中选择“Xml序列化程序”而非默认的数据协定序列化程序。

方案3:手动解析XML(绕过自动生成类的限制)

如果上述方案无效,直接用XmlReader手动解析响应XML,提取所需的Values值:

using System.Xml;
using System.IO;

public List<string> ExtractAttributeValues(string soapResponseXml)
{
    var values = new List<string>();
    using var reader = XmlReader.Create(new StringReader(soapResponseXml));
    
    while (reader.Read())
    {
        // 定位到AttributeGroups下的Values子元素
        if (reader.IsStartElement("Values") && reader.ParentNode?.Name == "Values")
        {
            reader.Read(); // 移动到文本节点
            if (reader.NodeType == XmlNodeType.Text)
            {
                values.Add(reader.Value);
            }
        }
    }
    return values;
}

调用此方法后,可将提取的值手动赋值给业务对象属性。

内容的提问来源于stack exchange,提问作者Jaspreet Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:37:39