我发布了这个问题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的后果,如果有的话?
答案 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甚至不会发出吱吱声。
尽管如此,如果您关心的验证结果超出实际可行性,那么您只需遵守规则......或忽略它。