0

我有一个以 complexType 作为返回值的现有 Web 服务。

<xs:complexType name="dummy">
  <xs:sequence>
    <xs:element minOccurs="0" maxOccurs="1" name="A" type="xs:string" /> 
  </xs:sequence>
</xs:complexType>

稍后(在一些客户投入生产之后)我想扩展我的 Web 服务。详细来说,我想添加一个复杂类型的新可选子元素:

<xs:complexType name="dummy">
  <xs:sequence>
    <xs:element minOccurs="0" maxOccurs="1" name="A" type="xs:string" /> 
    <xs:element minOccurs="0" maxOccurs="1" name="B" type="xs:string" /> 
  </xs:sequence>
</xs:complexType>

我是否破坏了现有客户?如果是,那么处理现有 Web 服务增强的正确/常用方法是什么?

4

1 回答 1

1

把你的问题文学化,答案是肯定的。

Java 客户端基于生成的代码,它们正在验证实际合同是否与生成客户端的合同相匹配。我通过添加新方法打破了 JAX-WS 生成的 Java 客户端的合同——理论上这不应该是一个问题。但是我在初始化代码中设置了端点地址。

一些未验证的客户可以使用更改后的合同,只要他们不满足未知字段。在您的情况下,只要您不显示可选的新元素,它们就会使用消息,但是当消息中存在此类元素时,它们会抛出错误(我们的客户端有嗯......好吧..客户端,以这种方式运行,他们有旧定义,但新字段几乎总是为空 - 并且不存在于 XML 中)。

动态生成的客户端(例如在 Python 中)正在根据当前合约生成响应,并且因为在那种语言中您可以向现有对象添加新字段,所以它们在您的情况下将毫无问题地工作。

所以长答案是:这取决于客户使用你的合同。

如何管理此类更改:这不是一个好方法,但如果您对使用的客户端和更新时间没有影响,请保留旧的 Web 服务并在新 URL 下并行发布新版本。

于 2013-09-10T12:31:42.890 回答