问题:
我将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; }
}
答案 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;