WebService的WebMethod预期返回DataSet却返回数组的问题求助
解决WebMethod声明返回DataSet却实际拿到数组的问题
别慌哈,新手刚接触WebService遇到这种序列化的小问题太正常了!我来帮你一步步理清原因和解决办法:
为什么会出现这种情况?
当你在VS里添加Web引用时,自动生成的代理类会对WebService的返回类型做「适配」——因为SOAP协议对DataSet的序列化逻辑比较特殊,默认会把DataSet里的DataTable转换成对应的强类型行数组(比如你的PopularItems对应的PopularItemsRow[]),而不是直接返回DataSet对象。这不是你的代码写错了,是工具的默认行为~
解决办法有三种,按需选:
1. 重新生成代理类,强制返回DataSet
这是最直接的办法:
- 删掉当前的Web引用(右键项目里的Web引用文件夹,选删除)
- 重新添加Web引用,在弹出的窗口里点击高级按钮
- 在「Web引用设置」里,找到「将DataSet类型作为DataSet返回」(不同VS版本文字可能稍有差异,找类似的选项就行)
- 勾选这个选项,然后完成引用添加,之后再调用
s.GetPopularFlavors()就会直接返回DataSet了
2. 手动把数组转换成DataSet(不用改代理)
如果不想重新生成代理,也可以手动处理返回的数组:
localhost.Statistics s = new localhost.Statistics(); // 假设返回的是PopularItemsRow类型的数组 localhost.PopularItemsRow[] flavorRows = s.GetPopularFlavors(); // 创建对应的DataTable并添加行 localhost.PopularItemsDataTable flavorTable = new localhost.PopularItemsDataTable(); foreach (var row in flavorRows) { flavorTable.ImportRow(row); } // 把DataTable放进DataSet里 DataSet ds = new DataSet(); ds.Tables.Add(flavorTable); topItems.DataSource = ds;
3. 先确认Helper方法的返回值(新手必查)
最后别忘了检查一下Helper.PopularItems()是不是真的返回了包含DataTable的DataSet,而不是直接返回DataTable或者数组——有时候新手可能会不小心把返回值写错,这也是常见的小失误哦!
内容的提问来源于stack exchange,提问作者Itay Habani
相关产品推荐
相关产品推荐

