.NET Core XML序列化移除列表外层包装标签 MessageContract配置不生效
问题根因
[MessageContract] 是WCF专属的顶级消息契约特性,仅对服务接口直接返回的消息根节点生效,嵌套在内部的类标注的 [MessageContract(IsWrapped=false)] 不会被序列化器识别,因此配置被忽略。
解决步骤
1. 替换序列化特性
移除所有嵌套类的 [MessageContract]、[MessageBodyMember] 标记,改用 System.Xml.Serialization 命名空间下的特性控制列表序列化行为,给列表字段标注 [XmlElement] 即可去掉外层包裹标签:
public class shipment { public string ShipID { get; set; } public string ShipNo { get; set; } public string ShipDate { get; set; } public string CustCode { get; set; } public string ShipSumm { get; set; } public string PONumbers { get; set; } public string ShipComments { get; set; } public string SuperUsers { get; set; } // 关键配置:指定每个列表项的节点名,自动省略外层<OrderItem>包裹标签 [XmlElement("OrderItem")] public List<orderItem> OrderItem { get; set; } } // orderItem无需标注MessageContract public class orderItem { public string Code { get; set; } public string Qty { get; set; } }
如果需要同时去掉其他列表的外层包裹,比如dataExtract下的DataExtract列表、ExportShipmentsResponse下的ExportShipmentsResult列表,也可以对应加上[XmlElement]标记:
public class dataExtract { [XmlElement("shipment")] public List<shipment> DataExtract { get; set; } } [MessageContract] public partial class ExportShipmentsResponse { [MessageBodyMember] [XmlElement("dataExtract")] public List<dataExtract> ExportShipmentsResult { get; set; } }
2. 配置序列化器
若为ASP.NET Core Web API服务
在Program.cs中显式启用XmlSerializer格式化器:
builder.Services.AddControllers() .AddXmlSerializerFormatters();
若为WCF Core服务
给服务契约接口添加[XmlSerializerFormat]特性,指定使用XmlSerializer进行序列化:
[ServiceContract] [XmlSerializerFormat] public interface ICallbackService { [OperationContract] Task<ExportShipmentsResponse> ExportShipments(ExportShipments request); }
修改完成后重新运行,即可得到无外层列表包裹标签的XML响应。
内容的提问来源于stack exchange,提问作者DaveCore
相关产品推荐
相关产品推荐

