2009-04-02 5 views
1

Могу ли я заключить договор с этой формой?Как вы отправляете сложные объекты с помощью WCF? Это работает? Это хорошо?

[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. Можете ли вы сделать это в веб-службе?

ответ

4

Чтобы использовать ту же модель для веб-сервисов, отметьте свой класс как 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

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

1

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

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

+0

, пожалуйста, сообщите :) – Perpetualcoder

+0

Если вы используете JavaScript без использования каких-либо клиентов-заглушек и попадаете в службу WCF, которая может принимать или выдавать базовые типы или интерфейсы, вам необходимо указать тип объекта, являющегося в комплект поставки. Вы можете сделать это, используя переменную __type в объекте аргументов JavaScript. Здесь много писать, поэтому я написал статью в своем блоге. Не стесняйтесь проверить это. http://coab.wordpress.com/2010/03/01/serializing-and-deserializing-derived-types-or-interfaces-in-wcf/ – floatingfrisbee