我正在努力建立一个Java B2B网络服务的客户端,我想我已经确定了我们已经存在一段时间的问题的原因.不幸的是我无法发布WSDL.
显然,我的自动生成的代理代码(通过wsdl.exe:由于WCF不支持密码摘要而必须使用WSE 3.0)无法处理具有多个具有相同复杂返回类型的Web方法的Web服务的WSDL.
举例来说 - 一个定义以下方法的Web服务:
Public ComplexTypeX Blah(); Public ComplexTypeX Blue(); Public ComplexTypeX Foo(); Public ComplexTypeY Bar();
在我的Reference.cs文件中,如果我注释掉调用Blah(),Blue()或Foo()中任意两个的所有代码,那么剩余的未注释方法可以被调用没有问题.但是,如果我没有注释掉这三种方法中的一种(比如Blah()和Foo()),那么在实例化 Web服务客户端代码时我会收到以下错误消息:
"Blah方法无法反映出来." "命名空间' http://some.url '中的XML元素'ComplexTypeX' 引用方法和类型.使用WebMethodAttribute更改方法的消息名称,或使用XmlRootAttribute更改类型的根元素."
现在,肯定没有任何ComplexTypeX
方法被定义为Web服务的一部分,所以我只能假设.NET(或至少wsdl.exe)不允许您使用返回复杂(用户定义)的Web服务多种方法中相同类型的类型......对吗?
我遇到了类似的问题,这就是我发现的:
我已经定义了一个复杂的类型作为响应返回:
public class FooResponse {...} [WebMethod] public FooResponse Foo() {...}
请注意,这里Foo/Foo + Response的确切名称配对非常重要.当我按如下方式更改方法名称时,问题就消失了:
public class FooResponse {...} [WebMethod] public FooResponse Fooxxx() {...}
我相信正在发生的事情是.NET试图使用名为FooResponse的元素自动包装来自Foo方法的响应.使用与要返回的对象相同的名称会产生歧义.尝试更改响应对象的名称或方法的名称以避免此冲突.