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>

如您所见,加法和减法操作都具有分别具有相同名称“InputNums”和“Result”的输入和输出消息。

当我尝试验证此 WSDL 时,我收到以下错误:

为此输入元素指定的名称“InputNums”不是唯一的。输入元素的名称必须与“TestService”端口类型中定义的所有其他输入和输出元素的名称不同。

我在这里阅读了 WSDL 规范,但没有清楚地说明原因(至少对我而言)。它说:

输入和输出元素的名称属性在封闭端口类型内的所有输入和输出元素中提供唯一名称。为了避免必须命名操作中的每个输入和输出元素,WSDL 提供了一些基于操作名称的默认值。

为了避免命名每个输入/输出元素,WSDL 提供了默认值。但为什么这是一个规则?不应该是警告吗?如果开发商愿意,他/她不能自己提供姓名吗?

此外,我不明白为什么这是一个问题,因为当客户端调用 Web 服务时,它们会使用称为“添加”或“减法”的特定操作名称进行调用。我的问题最后是 - 只要操作名称不同,为什么参数名称很重要?如果有的话,有人可以解释一下拥有这样的 WSDL 的后果吗?

4

1 回答 1

0

我认为如果您描述的话,可能会有更好的答案why not?。如果您坚持使用默认设置,它会对您有什么影响?如果你想命名它们,为什么不遵守规则呢?

这并不是说你有些不对。事实上,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 甚至不会吱吱作响。

尽管如此,如果您关心的验证结果超出了实用性,那么您只需要坚持规则......或者忽略它。

于 2012-10-18T03:56:26.853 回答