Как вы отправляете сложные объекты с помощью WCF?Работает ли это?Это хорошо?

StackOverflow https://stackoverflow.com/questions/710856

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top