C # .NET веб-сервис и возвращение списка объектов, которые имеют детей со списком дочерних объектов - PullRequest
4 голосов
/ 01 июля 2010

Я создаю веб-сервис для передачи списка объектов (исполнителей).Внутри объекта Artist есть список (альбом) объектов.Внутри объекта Album есть список песен.

Итак, я строю большое родительское дочернее дерево музыки.

У меня вопрос, как мне передать это с помощью SOAP?

Какой метод лучше всего использовать.

Прямо сейчас все, что я получаю, это

<Artist>
    <Name>string</Name>
    <Albums>
        <AlbumName>string</AlbumName>
        <Album xsi:nil="true" />
    <Album xsi:nil="true" />
    </Albums>
    <Albums>
        <AlbumName>string</AlbumName>
        <Album xsi:nil="true" />
        <Album xsi:nil="true" />
    </Albums>
</Artist>

Он разбивается на альбомы, но показывает два альбома, которые я сохранил.

Любые предложения будут оценены!*

Ответы [ 2 ]

8 голосов
/ 01 июля 2010

Хорошей новостью является то, что веб-сервис .NET позаботится о XML для вас. Все, что вам нужно сделать, это объявить тип возвращаемого значения List<Artist> или аналогичный. Веб-сервис позаботится о сериализации ваших объектов в XML для вас. Непонятно, катал ли ты свой собственный XML.

Вставленный вами XML выглядит так, как будто он получен из WSDL.

Запустите ваш проект в Visual Studio и перейдите на страницу .asmx веб-службы. Вы найдете что-то вроде этого.

Чтобы проверить работу с использованием протокола HTTP POST, нажмите кнопку «Invoke». alt text

Нажмите эту кнопку, чтобы запустить метод.

Возможно, попробуйте этот простой тестовый WebMethod, если ваш собственный не работает так, как вы ожидаете: Результатом будет этот документ XML .

  [WebMethod]
  public List<Artist> ListAllArtists()
  {
      List<Artist> all = new List<Artist>();
      Album one = new Album { Name = "hi", SongNames = new List<string> { "foo", "bar", "baz" } };
      Album two = new Album { Name = "salut", SongNames = new List<string> { "green", "orange", "red" } };
      Album three = new Album { Name = "hey", SongNames = new List<string> { "brown", "pink", "blue" } };
      Album four = new Album { Name = "hello", SongNames = new List<string> { "apple", "orange", "pear" } };

      all.Add(new Artist { Albums = new List<Album> { one }, Name = "Mr Guy" });
      all.Add(new Artist { Albums = new List<Album> { two }, Name = "Mr Buddy" });
      all.Add(new Artist { Albums = new List<Album> { three, four }, Name = "Mr Friend" });

      return all;        
  }

public class Artist
{
    public List<Album> Albums;
    public string Name;
}

public class Album
{
    public string Name;
    public List<string> SongNames;
}
2 голосов
/ 01 июля 2010

Примерно так:

[DataContract]
class Artist
{
   .....
   [DataMember]
   public List<Album> Albums;
   .....
}

[DataContract]
class Album
{
   .....
   int ID;
   .....
   [DataMember]
   public List<Song> Songs;
   .....
}

[DataContract]
class Song
{
   .....
   int ID;
   .....
   [DataMember]
   public string Title;
   .....
}

ПРИМЕЧАНИЕ: Это просто чтобы показать, как заставить ваши объекты сериализоваться. Измените его, чтобы использовать свойства вместо открытых полей и т. Д. *

Вам нужно просто внедрить службу WCF и использовать List<Artist>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...