Возврат ArrayList из службы ASMX - PullRequest
0 голосов
/ 12 марта 2012

У меня есть пара вопросов, касающихся веб-сервисов, и я был бы очень признателен, если бы кто-то указал мне правильное направление.

В моей библиотеке классов у меня есть два класса: Hotel & RoomType. Класс отеля содержит ArrayList объектов RoomType.

В моем веб-сервисе у меня есть метод GetHotels следующим образом:

[WebMethod]
[XmlInclude(typeof(Hotel))]
[XmlInclude(typeof(RoomType))]
public ArrayList GetHotels()
{
    return Sistema.GetInstance().GetHotels();
}

GetHotels () в классе Система, извлекает информацию из базы данных и возвращает ArrayList.

Мне пришлось использовать XMLInclude, потому что я получал:

Тип Hotel (или RoomType) не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые статически не известны

Тогда в моем веб-приложении у меня есть этот код:

WebService sample = new Service();
ArrayList hotels = service.GetHotels();

Это не компилируется, поэтому мне пришлось перейти на следующий код:

WebService sample = new Service();
object[] hotels = service.GetHotels();

Вот мой первый вопрос: Можно ли вернуть ArrayList или каждый раз, когда мне придется приводить результат к ArrayList?

Зная, что ArrayList содержит объекты Hotel, я добавил следующий код:

foreach (Hotel hotel in hotels)
{
    ...        
}

Это компилируется, но когда я выполняю, я получаю следующую ошибку:

Невозможно привести объект типа 'System.Xml.XmlNode []' к типу "Отель".

Итак, мой следующий вопрос: Как я могу привести результат к объекту отеля и работать с ним?

Ответы [ 3 ]

6 голосов
/ 12 марта 2012

Ни ArrayList, ни какой-либо другой тип, специфичный для .NET, никогда не будут передаваться по сети от веб-службы. Веб-сервисы говорят только на XML.

Подробнее см. : как работают веб-службы .

В данном конкретном случае ArrayList рассматривается как object[], что означает: «произвольное число какого-либо объекта». Единственный способ справиться с этим в SOAP XML - это обрабатывать его как массив какого-то узла XML, следовательно, XmlNode[].

1 голос
/ 12 марта 2012

Техника - 1, чтобы избежать приведения типа

dynamic hotels = service.GetHotels();
foreach (Hotel str in d)
{
   //Your Code
}

Техника - 2, чтобы избежать приведения типа

var hotels = service.GetHotels();
foreach (Hotel str in d)
{
   //Your Code
}
1 голос
/ 12 марта 2012

Сложные объекты преобразуются в простые объекты при прохождении через SOAP.

Я предлагаю использовать этот Список <> в вашем веб-сервисе

public List<Hotel> GetHotels()
{
  return ...;
}

, поэтому при вызове метода у вас будет Массив отеля

Hotel[] hotels = service.GetHotels();

а потом напишешь

foreach (Hotel hotel in hotels)
{
...        
}
...