近期在写WinForm调用WebService的相关程序,遇到一些“莫名其妙”的问题:
System.InvalidOperationException: 生成 XML 文档时出错。 ---> System.InvalidOperationException: 类型 System.String[] 不能在此上下文中使用。
System.InvalidOperationException: 生成 XML 文档时出错。 ---> System.InvalidOperationException: 类型 System.Int32[] 不能在此上下文中使用。
System.InvalidOperationException: 生成 XML 文档时出错。 ---> System.InvalidOperationException: 不应是类型 Aspx_new.tinvoke。使用 XmlInclude 或 SoapInclude 特性静态指定非已知的类型。
之前曾经测试过用WebService返回自定义的类,都能正常返回,难道系统自带的类型却不劫持?后来测试直接返回自定义类型竟然是正常的,再次调用返回dynamic类型的方法,又不报错了。:<
最后测试发现,返回dynamic类型时所有非简单值的还回都”可能“报错,如果返回值不是简单类型(基本类型:int,string),比如数组、对象数组等必须保证当前类中有一个方法返回值是这种类型。
public class CallServer : WebService
{
[WebMethod] 这个方法返回dynamic类型或object类型因为它是用来调用其它类的方法的,返回值不确定
public object |dynamic CallServerMethod(string classFullName, string methodName, params object[] parameters) //
{}
[WebMethod] 如果CallServerMethod要返回整型数组,这样就不会报错。其它类型 同理。
public int[] GetIntArr()
{ return null; }
}
分析原因,可能是非简单类型,XML没有对应的处理结构,所以会报错,当类中包含相应的特殊类型后,XML会预先生成相应的处理结构,就不会报错。这个猜测在客户端调用的的代码中同样适用,即用开发工具生成的Web引用类如果使用了dynamic类型方法返回了一个特殊 类型 ,在调用时同样会报错----这个错误发生在服务端已经增加了相应的返回类型的方法,但客户端没有更新时。
文中提及内容在XP,.net4下开发。高版本是否已经修正不得而知。
最后补充一 点:微软真的太2了!!!更新太快了