我们使用了第三方Web服务,并尝试从ASP.NET Web应用程序调用它 . 但是,当我实例化Web服务时,抛出以下System.InvalidOperationException异常:
方法'ABC.XYZ'无法反映 . System.InvalidOperationException:无法反映方法“ABC.XYZ” . ---> System.InvalidOperationException:命名空间“http://mysoftware.com/ns”中的XML元素“MyDoc”引用方法和类型 . 使用WebMethodAttribute更改方法的消息名称,或使用XmlRootAttribute更改类型的根元素 .
从我可以收集的内容来看,Web服务中的方法和类型之间似乎存在一些歧义 . 任何人都可以澄清这个例外的可能原因,有什么我可以做的来纠正这个或者我应该去网络服务所有者纠正?
编辑:Visual Studio 2008已创建代理类 . 不幸的是,我无法提供wsdl的链接,因为它是本地安装的第三方应用程序的Web服务 .
9 回答
我今天早些时候遇到了同样的问题 . 原因是 - 由Visual Studio生成并作为参数传递给其中一个方法的类没有默认的无参数构造函数 . 一旦我添加它,错误就消失了 .
似乎问题在于VS和用Java编写的Web服务之间的数据类型问题 .
最终,它通过手动编辑由VS创建的类和模式文件来修复 .
当我使用第三方Web服务时,我遇到了完全相同的问题 . 此实例中的问题是引用文件中的mustUndertand属性正在查找布尔值,其中namespace属性查找字符串 .
通过查看引用,我能够识别有问题的属性,只需在方法签名中添加“覆盖”即可 .
不太理想,因为任何时候你必须更新服务,但我找不到任何其他方法 .
要查找参考文件,请从解决方案资源管理器中选择“所有文件”
希望这可以帮助
我猜测服务发出或提供的wsdl不是wsdl.exe或serviceutil可以理解的形式 - 你可以发布wsdl或链接吗?
你是如何创建代理类的?
您也可以尝试针对wsdl模式验证wsdl以检查其有效性
在我的情况下,我得到一个“方法无法反映”错误,因为在类被返回的方法,我没有暴露默认的无参数构造函数 .
我在VB.NET工作 . 在我的返回类中,我声明了一个“New(..)”方法,它采用了几个参数(因为这就是我想在代码中使用它的方式) . 但是通过这样做,我已经压制了VB在幕后添加的默认(隐藏)无参数New()构造函数 . 显然,Web服务处理程序要求无参数构造函数可用 . 一旦我向我的类中添加了一个无参数的New()构造函数,它一切正常 .
我得到了相同的消息但我的是由于缺少System.Runtime.Serialization.dll引起的,因为我试图在仅安装了.NET 2.0的机器上运行3.5应用程序 .
我有同样的问题,但我发现其中一个
WebMethod
参数有一个interface
类型的成员,这就是为什么VS
无法序列化它 . 这是尝试下载disco
文件时的例外旧线程,但我有一个不同的问题,也许是对某人的帮助 . 引用的dll在数据层和服务层上的两个版本之间混淆,导致了问题 .
可能发生此错误的另一种情况:我只是在我的Web服务中使用了另一个具有相同名称(但参数不同)的Web方法,该方法在代码合并期间滑入 . 我删除旧方法后,它工作 .