Как вы отправляете сложные объекты, используя WCF? Это работает? Это хорошо? - PullRequest
1 голос
/ 02 апреля 2009

Могу ли я иметь контракт данных этой формы ??

[DataContract]

public class YearlyStatistic{

[DataMember]
public string Year{get;set;}

[DataMember]
public string StatisticName {get;set;}

[DataMember]
public List<MonthlyStatistic> MonthlyStats {get;set}
};

Я предполагаю, что класс MonthlyStatistic также должен быть DataContract. Вы можете сделать это в веб-сервисе?

Ответы [ 3 ]

4 голосов
/ 02 апреля 2009

Чтобы использовать ту же модель для веб-сервисов, пометьте свой класс как Serializable, используя XmlRoot и XmlElement в пространстве имен System.Xml.Serialization. Вот пример использования вашего примера:

[Serializable]
[XmlRoot("YearlyStatistic")]
public class YearlyStatistic
{
    [XmlElement("Year")]
    public string Year { get; set; }

    [XmlElement("StatisticName")]
    public string StatisticName { get; set; }

    [XmlElement("MonthlyStats")]
    public List<MonthlyStatistic> MonthlyStats { get; set; } 
}

Вы должны будете сделать то же самое для свойств сложного объекта родительского объекта.

1 голос
/ 28 февраля 2010

Да, вы можете отправлять упомянутый выше контракт с данными из службы WCF. Как вы сказали, MonthlyStatistic и все его члены должны быть определены как сами контракты данных или быть встроенными в типы (например, строки).

Вы даже можете отправлять и получать более сложные типы, например, когда у вас есть базовый класс, но вы хотите отправить или получить объект производного класса (вы могли бы сделать это с помощью атрибута KnownType). При получении (десериализации) из Javascript есть хитрость, с помощью которой вы должны указать тип WCF. Если вы заинтересованы, не стесняйтесь спрашивать.

1 голос
/ 02 апреля 2009

Да, это стандартная сериализация WCF. Вы пытаетесь сказать, что у коллекции MonthlyStats есть свойство WeeklyStats или у каждого отдельного MonthlyStatistic есть коллекция WeeklyStat? Если это первое, то это не работает в WCF изначально. Вам нужно будет немного поиграть, чтобы заставить его работать. Если это последний, то это прекрасно.

...