输入/输出元素的名称必须是唯一的(WSDL规范)

3

我在这里发布了这个问题,但没有得到任何答案。所以我也在这里发布了它。


我对WSDL有一个问题。

我有一个WSDL,其中包含以下两种方法:

<portType name="TestService">
    <operation name="add">
        <input
            wsam:Action="http://service.psvm.com/testservice/TestService/addRequest"
            message="tns:add"
            name="InputNums" />
        <output
            wsam:Action="http://service.psvm.com/testservice/TestService/addResponse"
            message="tns:addResponse"
            name="Result" />
    </operation>
    <operation name="subtract">
        <input
            wsam:Action="http://service.psvm.com/testservice/TestService/subtractRequest"
            message="tns:subtract"
            name="InputNums" />
        <output
            wsam:Action="http://service.psvm.com/testservice/TestService/subtractResponse"
            message="tns:subtractResponse"
            name="Result" />
    </operation>
</portType>

正如您所看到的,add和subtract这两个操作都有输入和输出消息,它们分别使用相同的名称“InputNums”和“Result”。 当我尝试验证此WSDL时,我会收到以下错误消息:
“The name 'InputNums' specified for this input element is not unique. The name of an input element must be unique from the names of all other input and output elements defined in the 'TestService' port type.”
我阅读了这里的WSDL规范,但并没有清楚地说明原因。它说:
“The name attribute of the input and output elements provides a unique name among all input and output elements within the enclosing port type. In order to avoid having to name each input and output element within an operation, WSDL provides some default values based on the operation name.”
为了避免为每个操作中的每个输入和输出元素命名,WSDL提供了一些默认值。但是为什么这是一个规则?难道不应该是警告吗?如果开发人员想要,难道他们不能自己提供名称吗?
此外,我不明白为什么这是一个问题,因为客户端调用Web服务时,它们会调用名为“add”或“subtract”的特定操作。我的最后一个问题是 - 只要操作名称不同,参数名称为什么很重要?如果有的话,请有人解释一下这样做的后果是什么?

那个灰色盒子中似乎缺少了一些东西。 - rolve
我正在编辑它。不知为何,WSDL内容未显示出来。现在你能看到了吗? - Meghana Reddy
1个回答

0

我认为如果您描述一下“为什么不这样做?”可能会得到更好的答案。如果您坚持使用默认设置会对您产生什么影响?如果您想要命名它们,那么为什么不遵循规则?

这并不是说您完全没有道理。事实上,WSDL 2.0 完全删除了这个属性。因此,我猜测,在规范上工作的人员在基于1.1注释的实现中没有发现任何实际使用这个规则的证据,所以在这个精神下,他们放弃了它,连同属性一起。我非常确定这些名称即使与RPC风格绑定一起使用也没有用处。

我可以看出为什么在早期有人会制定这个规则:它与名称的其他规则一致;我想他们认为后续的绑定规范可能会发现这些名称唯一的用途。

如果有人通过问为什么在 WSDL 1.1 的 XSD 中没有执行这个规则来反驳我的观点,就像其他名称规则一样,我会回答说,XSD 无法表达这个约束(因为它跨越两个可能同时匹配的选择器)。

我真的认为这很重要,你为什么在意呢。我测试过的所有工具(.NET和JAX-WS)似乎都不在意它:它们能够执行其合同到代码绑定。WS-I BP 1.x和2.x似乎甚至没有涉及它。所有这些以及看到WSDL 2.0完全放弃它,告诉你你是对的,它是/曾经是无用的。

我也知道一些工具不会验证像你这样的WSDL;另一方面,.NET甚至不会吱声。

尽管如此,如果您关心超出实际需要的挑剔验证结果,那么您只需坚持遵守规则...或忽略它。


为什么不呢?-嗯,问题在于:我需要提供一个 Web 服务,其中有 10 种不同的方法,这些方法都接受相同的参数集(比如说 20 个变量),进行一些计算并返回相同的参数集,但是带有更新后的值。现在,我已经将所有这些 20 个变量放入了一个 POJO 中,并将同样的 POJO 作为输入和输出接受所有这些 10 种方法。我编写的 WSDL 对所有这些参数使用了相同的对象名称。WSDL 验证失败,因为存在唯一名称约束。如果我为 POJO 使用不同的对象名称,则需要拥有 10 个不同的对象(或者 20 个),这些对象实际上将具有相同的 20 个变量。 - Meghana Reddy
由于我们遵循的是WSDL 1.1和第三方客户端,这些客户端不接受它,因为它不符合规范。我不得不花费很多时间来说服他们。虽然最终有个好结局,但如果WSDL规范一开始就没有这个规则,那么这种痛苦本可以避免 :-) 注意:我不得不分开我的评论,因为stackoverflow只接受600个字符。 - Meghana Reddy
@MeghanaReddy,我还有点困惑。如果可以的话,你能告诉我wsdl:input和wsdl:output元素的名称与你的Java和/或电线上的XML之间的关系吗?我想知道我错过了什么,因为据我所知,不应该有任何问题。 - Petru Gardea

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