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

时间:2010-03-25 20:46:34

标签: wcf datacontractserializer

问题:

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

问题是我的所有字段都被反序列化,但两个字段除外。 price_retail price_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; }
}

2 个答案:

答案 0 :(得分:49)

您的讯息的字段顺序错误。 DataContracts默认为按字母顺序排序,声明顺序;并期望XML元素按顺序到达;通常会丢弃乱序元素。

修复合同以明确指定正确的顺序(使用DataMemberAttribute的Order属性)或确保客户端在正确的顺序中发送它们。

答案 1 :(得分:0)

您可以尝试使用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设置为你的课程(不适合我)。 查看网址&#34;手动切换到XmlSerializer&#34;