?wsdl和?singleWsdl参数有什么区别?

30

我的消息提供程序给了我两种不同类型的WSDL来使用。

http://my.amazonaws.com:8000/webservice/?wsdl
http://my.amazonaws.com:8000/webservice/?singleWsdl

第一个是嵌入式WSDL。不能用它来生成WSDL2java包,也不能使用JAX-WS创建连接。

第二个是独立的WSDL。可以使用CXF 3.0的WSDL2java生成Java包,并且可以使用JAX-WS创建连接。它工作得非常好。

请告诉我这两种WSDL之间的区别是什么。

1个回答

41

不知道这些链接返回的内容是什么,我们只能猜测,但以下细节可能会对您有所帮助...

在Web服务端点后缀为?wsdl将获得一个WSDL文件。WSDL可以由框架在运行时生成,基于Web服务骨架代码,也可以是实际物理文件,当指定URL参数时服务器发送回去。

WSDL包含一个XML模式,可以在WSDL本身内部指定,也可以作为由WSDL引用的单独文件来指定。然后出现了一个问题...

一些Web服务存根生成器只能处理包含模式的完整WSDL。如果WSDL导入其他文件,则该工具无法解析导入并失败。这使得Web服务难以使用,因为客户端存在与Web服务交互的存根创建问题。事实上,服务提供商要么使用实际的WSDL响应?wsdl请求,要么开始编写各种各样的黑客和插件来使Web服务生成完整的WSDL。

但是,一些提供者甚至都没有费心,因此客户端必须编写黑客程序来解析WSDL,或者他们必须下载所有文件,并将它们手动组装成单个文件,然后使用该文件。

随着时间的推移,人们意识到这是一个问题,框架进行了适应以提供完整的WSDL,而不是带有导入的WSDL。但这产生了另一个问题。更改?wsdl URL返回的内容可能会破坏围绕其解决导入问题的所有黑客。因此,选择了另一种惯例来返回完整的WSDL:?singleWsdl

因此,有些框架生成完整的WSDL,有些生成带有导入的WSDL,有些允许您指定实际的物理文件,有些支持?singleWsdl惯例,有些则不支持。与此问题无关,但为了完整性,还有一个?wsdl2惯例,它可以获取WSDL 2.0定义(?wsdl使您获得WSDL 1.1)。一些框架支持?wsdl2,而一些则不支持。

我的猜测是你遇到的问题是由于模式导入引起的,但没有WSDL本身,我无法判断。希望这些细节能帮助你更好地识别问题。


谢谢你的回答,Bogdan! - yw173
我错了还是根据这个答案,应该假设 ?singleWsdl 是首选? - Veverke
1
@Veverke:当服务和客户端使用相同的技术栈时,大多数情况下都没有关系(例如,svcutil可以处理WCF服务的任何形式的WSDL内容)。当涉及跨技术栈时,使用“?singleWsdl”选项是最安全的选择(假设该服务支持它)。 - Bogdan
@Bogdan:伙计,你绝对不需要知道那些URL才能回答这个问题。对我来说,这是同样的问题,singlewsdl在我们的客户端使用时可以工作,而wsdl不能工作。虽然你的答案被接受了,但一开始就太胆怯了,因为它是关于概念的,而不是内部的东西。你可以拿起一个小的WCF服务,你也会有同样的问题(从4.5版本开始),你可以解释一下,伙计。 - Jasmine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接