8

目前,我正在为 Java B2B Web 服务构建客户端,我想我已经确定了我们已经有很长一段时间的问题的原因。不幸的是,我无法发布 WSDL。

显然,我的自动生成的代理代码(通过 wsdl.exe:由于 WCF 不支持密码摘要而必须使用 WSE 3.0)无法处理具有多个具有相同复杂返回类型的 Web 方法的 Web 服务的 WSDL。

举个例子 - 一个定义以下方法的网络服务:

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 服务跨多个方法的相同类型的类型......对吗?

4

6 回答 6

8

我遇到了类似的问题,这是我发现的:

我已经定义了一个复杂类型作为响应返回:

public class FooResponse {...}

[WebMethod]
public FooResponse Foo() {...}

请注意,此处 Foo/Foo+Response 的确切名称配对很重要。当我如下更改方法名称时,问题就消失了:

public class FooResponse {...}

[WebMethod]
public FooResponse Fooxxx() {...}

我认为正在发生的事情是 .NET 正在尝试使用名为 FooResponse 的元素自动包装来自 Foo 方法的响应。使用与要返回的对象相同的名称会产生歧义。尝试更改响应对象的名称或方法的名称以避免这种冲突。

于 2010-07-02T20:33:41.847 回答
3

我刚刚搜索了“引用方法和类型”,发现了一个 Connect 错误报告“ System.InvalidOperationException: The XML element * from namespace * references a references a method and a type ”。在这种情况下,存在具有完全相同名称(本地名称和命名空间)的操作和元素。


值得注意的是微软的部分回应:

我们不再对 ASMX 进行增强;我们继续支持其现有功能,但在可能的情况下,我们建议改用 WCF。

于 2009-07-22T12:21:58.380 回答
1

我发现了另一个引发错误的案例!这是我的代码:

[WebMethod]
public CheckUpdateResponse CheckUpdate()
{
...
}

好的,我解释一下:返回类型CheckUpdateResponse是结构,CheckUpdate()是方法。因此,在 WSDL .NET 中,自动在其中一个 XML 元素中Response的方法名称中添加“”后缀来CheckUpdate描述方法的返回值。

等等:它发现了一个重复的元素并给出错误“使用 WebMethodAttribute 更改方法的消息名称......”

解决方案?我将返回类型重命名为“CheckUpdateResult”,现在一切正常!

我希望这会对某人有所帮助!

于 2012-11-27T19:22:38.283 回答
0

所以我只能假设.NET(或至少 wsdl.exe)不允许您使用通过多种方法返回相同类型的复杂(用户定义)类型的 Web 服务......对吗?

这是不正确的。想象一下,如果它是真的,那将是多么痛苦——你只能有一个返回 String 的方法,一个返回 Double 的方法,一个返回 SomeObject 的方法,等等……这将是一场噩梦。

我对 .NET 中的 Web 服务不是很熟悉,但是从您收到的错误来看,您似乎遇到了 XML 命名空间的问题——可能存在名称冲突。我会尝试按照错误消息中的建议来修改WebMethodAttribute.

此外,如果您由于某些公司隐私/敏感性问题而无法发布与您遇到的问题相关的代码/文档,您应该发布仍能证明您的测试用例的净化版本。几乎任何“敏感”的东西都应该能够归结为更简单的代码片段,它仍然可以理解你的观点,而不会背叛任何敏感性。

于 2009-02-24T01:02:47.267 回答
0

很奇怪。通常,WSDL 会提供一个通用类型,当通过 wsdl.exe 或 svcutil.exe 编译时,您将获得一个共享的通用类型,以便在同一接口中的任意数量的方法中使用。

在同一个应用程序中引用多个独立的 WSDL 时会出现问题,这些 WSDL 共享一个表面上相同的类型,这会导致生成两个不同的 CLR 类型。有很多方法可以解决这个问题——这是众所周知的。然后是一些相关的问题,即将现有业务对象映射到从 WSDL 生成的类型。另一个以前探索过的景观。

但是你说的是不同的东西。

于 2009-02-24T05:53:10.487 回答
0

使用 WSDL.exe 有一个开关 /sharetypes。这应该解决这个问题。

此外,我不同意这是微软的事情,因为相同的类被暴露为位于多个 wsdl 中的不同复杂类型。那不是一个好的抽象设计。

共享类型的现成参考 Microsoft 文档 打开类型共享功能。此功能为不同服务之间共享的相同类型创建一个具有单一类型定义的代码文件(命名空间、名称和线路签名必须相同)。使用 http:// URL 作为命令行参数引用服务或为本地文件创建一个 discomap 文档。

于 2009-07-22T13:18:59.743 回答