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

标签 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 时,出现以下错误:

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 服务时,它们会使用称为“添加”或“减去”的特定操作名称进行调用。 我最后的问题是——只要操作名称不同,为什么参数名称很重要? 有人可以解释这样的 WSDL 的后果吗?

最佳答案

我认为如果您描述为什么不呢?,可能会得到更好的答案。如果您坚持使用默认设置,这对您有何影响?如果你想给他们起名字,为什么不遵守规则呢?

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

我明白为什么在早期有人会制定这条规则:它与名称的其余规则一致;我猜有人认为,后续的绑定(bind)规范可能会发现这些名称的独特性有一些用途。

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

我真的认为你为什么关心很重要。我测试过的所有工具(.NET 和 JAX-WS)并不真正介意:它们能够执行它们的契约(Contract)到代码绑定(bind)。 WS-I BP 1.x 和 2.x 似乎甚至没有解决它。所有这一切并看到 WSDL 2.0 将它们全部丢弃,告诉您您是对的,它是/没有用。

我也知道无法验证像您这样的 WSDL 的工具;另一方面,.NET 甚至不会吱吱作响。

不过,如果您关心的验证结果过于挑剔而不实用,那么您只能坚持规则……或者忽略它。

关于xml - 输入/输出元素的名称必须是唯一的(WSDL 规范),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12920350/

相关文章:

java - OS X 上的应用程序包不起作用,文件寻址问题

web-services - 仅使用magento API设置商店是否可行?

java - Soapui - 警告 - 未检测到文档的语法约束(DTD 或 XML 模式)

xml - 在XSD schema中,如何区分不同类型的IDREF

C# - 可移植类库 "XmlElement does not exist in the namespace System.XML"

android - 为什么我在 Android 上的 XML 文件被截断为 1000 字节

SQL 语句上的 php 绑定(bind)参数不起作用

java - 无法为 Spring Web 服务的元素找到 BeanDefinitionParser

javascript - 在 Chrome 的新窗口中呈现 XML

web-services - Sharepoint 2007 AddList 和 AddListFromFeature 缺少模板列和数据内容