WCF Datacontract, некоторые поля не десериализуются - PullRequest
27 голосов
/ 25 марта 2010

Проблема:

У меня есть настройка службы WCF, которая должна быть конечной точкой для вызова из внешней системы. Вызов отправляет простой XML. Я тестирую систему, отправляя вызовы в сервис из Fiddler с помощью RequestBuilder.

Проблема в том, что все мои поля десериализованы, за исключением двух полей. 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 ]

50 голосов
/ 26 марта 2010

Поля находятся в неправильном порядке для вашего сообщения. По умолчанию DataContracts имеет алфавитный порядок, а не порядок объявления; и ожидает, что элементы XML поступят в этом порядке; Элементы, вышедшие из строя, обычно отбрасываются.

Либо исправьте свой контракт, чтобы явно указать правильный заказ (используя свойство Order объекта DataMemberAttribute), либо убедитесь, что ваш клиент отправляет их в правильном порядке.

0 голосов
/ 24 октября 2017

Вы можете попробовать использовать 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»

...