WCF Datacontract,有些字段不反序列化

问题:

我有一个WCF服务设置为外部系统调用的端点。 这个调用是发送普通的XML。 我通过使用RequestBuilder将调用从Fiddler发送到服务来testing系统。

问题是我所有的领域都被反序列化,除了两个领域。 price_retailprice_wholesale

我错过了什么? 所有其他字段反序列化没有问题 – 服务响应。 这只是这些领域。

XML消息:

<widget_conclusion> <list_criteria_id>123</list_criteria_id> <list_type>consumer</list_type> <qty>500</qty> <price_retail>50.00</price_retail> <price_wholesale>40.00</price_wholesale> <session_id>123456789</session_id> </widget_conclusion> 

服务方式:

 public string WidgetConclusion(ConclusionMessage message) { var priceRetail = message.PriceRetail; } 

消息类别:

 [DataContract(Name = "widget_conclusion", Namespace = "")] public class ConclusionMessage { [DataMember(Name = "list_criteria_id")] public int CriteriaId { get; set;} [DataMember(Name = "list_type")] public string ListType { get; set; } [DataMember(Name = "qty")] public int ListQuantity { get; set; } [DataMember(Name = "price_retail")] public decimal PriceRetail { get; set; } [DataMember(Name = "price_wholesale")] public decimal PriceWholesale { get; set; } [DataMember(Name = "session_id")] public string SessionId { get; set; } } 

您的邮件的字段顺序错误。 DataContracts默认为按字母顺序排列,而不是声明顺序; 并期望XML元素按照这个顺序到达; 乱序元素通常被丢弃。

要么修复你的合同,明确地指定正确的顺序(使用DataMemberAttribute的Order属性),要么确保你的客户端正确地发送它们。

您可以尝试使用XmlSerializer而不是DataContractSerializer。 在我的情况下,我需要更改global.asax文件中的默认引擎:

 var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true; 

这样做要小心,因为一些XML可能变得无效,例如 – 命名空间,XmlSerializer应该像下面这样确定:

 [XmlNamespaceDeclarations] private XmlSerializerNamespaces xmlns { get { var xns = new XmlSerializerNamespaces(); xns.Add("i", "http://www.w3.org/2001/XMLSchema-instance"); return xns; } set { } } 

或者你可以设置XmlSerializerFormatAtrribute到你的类(不适合我)。 在url头中查看“手动切换到XmlSerializer”