从ASMX服务返回ArrayList

时间:2012-03-12 16:15:47

标签: c# asp.net web-services asmx

我对Web服务有几个问题,如果有人能指出我正确的方向,我真的很感激。

在我的班级图书馆,我有两个班级:酒店&房型。 Hotel类包含RoomType对象的ArrayList。

在我的Web服务中,我有一个GetHotels方法如下:

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

类Sistema中的GetHotels(),从数据库中检索信息并返回一个ArrayList。

我不得不使用XMLInclude,因为我得到了:

  

预计不会出现类型酒店(或RoomType)。使用XmlInclude或SoapInclude属性指定静态未知的类型

然后在我的Web应用程序中,我有这段代码:

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 []'类型的对象强制转换为'Hotel'。

所以,我的下一个问题是:如何将结果转换为酒店对象并使用它?

3 个答案:

答案 0 :(得分:6)

任何特定于.NET的ArrayList和任何其他类型都不会通过网络服务传递。 Web服务只讲XML。

有关详细信息,请参阅Basics: How Web Services Work

在这种特殊情况下,ArrayList被视为object[],这意味着:“任意数量的某种对象”。在SOAP XML中处理它的唯一方法是将其视为某种XML节点的数组,因此XmlNode[]

答案 1 :(得分:1)

复杂对象在通过SOAP时转换为简单对象。

我建议使用此列表<>在您的Web服务中

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

因此,当您调用该方法时,您将拥有一个酒店阵列

Hotel[] hotels = service.GetHotels();

然后你会写

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

答案 2 :(得分:1)

技术 - 1以避免类型转换

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

技术 - 2以避免类型转换

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