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

时间:2012-10-16 17:35:22

标签: xml web-services xsd wsdl unique

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


我对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规范,但没有明确说明原因(至少对我而言)。它说:

  

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

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

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

1 个答案:

答案 0 :(得分:0)

如果你要描述why not?,我认为可能会有更好的答案。如果你坚持使用默认值,它对你有什么用?如果你想给它们命名,为什么不按照规则?

这并不是说你不是对的。事实上,WSDL 2.0完全放弃了这个属性。所以我猜那些在规范上工作的人在基于1.1注释的实现中找不到任何证据,表明该规则的任何实际用途;所以在那种精神中,他们已经放弃了它,以及属性。我很确定这些名称即使使用RPC样式绑定也没用。

我可以理解为什么,在早期,有人会提出这个规则:它与其他规则的规则一致;我想有人认为后续的绑定规范可能会找到一些用途,这些名称是唯一的。

如果有人因为询问为什么它没有在WSSD 1.1的XSD中强制执行而与其他名称规则相同,我会回答说XSD不能表达这种约束(因为它跨越两个不同的选择器可以匹配)同时)。

我真的认为你为什么关心它很重要。我测试的所有工具(.NET和JAX-WS)并不介意它们:它们能够进行契约到代码绑定。 WS-I BP 1.x和2.x似乎甚至没有解决它。所有这些以及看到WSDL 2.0都将它们放在一起,告诉你你是对的,它是/没用的。

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

尽管如此,如果您关心的验证结果超出实际可行性,那么您只需遵守规则......或忽略它。