WCF Datacontract,某些字段未反序列化

WCF Datacontract,某些字段未反序列化,wcf,datacontractserializer,Wcf,Datacontractserializer,问题: 我将WCF服务设置为外部系统调用的端点。该调用正在发送纯xml。我通过使用RequestBuilder从Fiddler向服务发送调用来测试系统 问题是除两个字段外,我的所有字段都被反序列化零售价格和批发价格 我错过了什么?所有其他字段都会反序列化,不会出现问题-服务会响应。只是这些领域 XML消息: <widget_conclusion> <list_criteria_id>123</list_criteria_id> <list

问题:

我将WCF服务设置为外部系统调用的端点。该调用正在发送纯xml。我通过使用RequestBuilder从Fiddler向服务发送调用来测试系统

问题是除两个字段外,我的所有字段都被反序列化零售价格和批发价格

我错过了什么?所有其他字段都会反序列化,不会出现问题-服务会响应。只是这些领域

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>
消息类:

[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 { } 
}
或者你可以设置为你的班级(不为我工作)。
在url标题中查找“手动切换到XmlSerializer”

答案不错。我两种方法都试过了,行为正是你所描述的。错过简单的事情总是一种卑微的经历。我感兴趣的是为什么DataContracts默认按字母顺序排列。似乎维护声明的顺序更具声明性……但我认为提供order属性是最具声明性的。是的。我已经习惯了总是显式地声明顺序,这样以后事情就容易多了。有没有其他序列化程序(除了前德鲁时代的XmlSerializer)没有这种愚蠢的行为?因为如果我想要那种严格的超严格反序列化,我只会使用二进制。那么使用可选字段呢?(minOccurs=“0”)在wsdl中?这可能是响应的一部分,也可能不是。因此,它可能会完全打乱顺序。我当时处于类似的情况,似乎一切都做得很好,即:设置[DataMember(order=…)],但反序列化仍然不起作用。事实证明,DCS需要考虑[DataContract],以免为空。
[XmlNamespaceDeclarations] 
private XmlSerializerNamespaces xmlns 
{  
  get {
    var xns = new XmlSerializerNamespaces();
    xns.Add("i", "http://www.w3.org/2001/XMLSchema-instance");
    return xns;
  }    
  set { } 
}