30

问题:

我有一个 WCF 服务设置作为来自外部系统的调用的端点。呼叫正在发送纯 xml。我通过使用 RequestBuilder 从 Fiddler 向服务发送调用来测试系统。

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

2 回答 2

55

您的消息的字段顺序错误。DataContracts 默认按字母顺序而不是声明顺序;并期望 XML 元素按该顺序到达;乱序元素通常会被丢弃。

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

于 2010-03-25T22:49:54.747 回答
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设置为 You 类(不适用于我)。查看 url 头“手动切换到 XmlSerializer”

于 2017-10-24T11:35:31.577 回答