我对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'。
所以,我的下一个问题是:如何将结果转换为酒店对象并使用它?
答案 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)
dynamic hotels = service.GetHotels();
foreach (Hotel str in d)
{
//Your Code
}
var hotels = service.GetHotels();
foreach (Hotel str in d)
{
//Your Code
}