从ASMX服务返回ArrayList

本文关键字:ArrayList 返回 服务 ASMX | 更新日期: 2023-09-27 18:27:26

我有几个关于Web服务的问题,如果有人能为我指明正确的方向,我将不胜感激。

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

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

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

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

因此,我的下一个问题是:如何将结果投射到Hotel对象并使用它

从ASMX服务返回ArrayList

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

有关更多详细信息,请参阅"基础知识:Web服务如何工作"。

在这种特殊情况下,ArrayList被视为object[],意思是:"某种对象的任意数量"。在SOAPXML中处理这一问题的唯一方法是将其视为某种XML节点的数组,即XmlNode[]

当通过SOAP时,复杂对象会转换为简单对象。

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

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

所以当你调用该方法时,你会得到一个酒店数组

Hotel[] hotels = service.GetHotels();

然后你会写

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

避免类型铸造的技巧-1

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

技术-2避免类型铸造

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