什么是对 WSDL 契约的非破坏性或向后兼容的更改?
Posted
技术标签:
【中文标题】什么是对 WSDL 契约的非破坏性或向后兼容的更改?【英文标题】:What are considered non-breaking or backwards-compatible changes to a WSDL contract? 【发布时间】:2012-02-05 21:36:16 【问题描述】:This page 列出了以下示例:
向现有 WSDL 文档添加新的 WSDL 操作 在 WSDL 文档中添加新的 XML 模式类型,这些类型不包含在以前存在的类型中但是有没有定义或标准 哪些更改被认为是向后兼容的指南。或者换句话说,您可以对合同进行哪些更改,并且仍然希望不会破坏您的客户。
【问题讨论】:
【参考方案1】:附加的可选请求元素 (minoccurs=0) 也可以向后兼容 - 这取决于主机端的服务实现。 此外,将强制响应元素更改为可选 可能 也可以向后兼容 - 这取决于您的客户端的实现。
这个区域很棘手。
如果您真的担心向后兼容性,请考虑为新客户端创建新版本的服务,并为现有客户端保留现有实现。此外,一般来说,避免通过您的服务发送域对象 - 使用 DTO。
希望这会有所帮助。
【讨论】:
是的,它似乎是一个灰色区域。我也会考虑添加向后兼容的可选参数。只是想知道是否有一些关于你可以做出的改变的普遍协议,并且仍然期望客户也能工作。诚然,总是可以有一个新版本,但如果没有必要,我宁愿避免这种情况。 我不知道有一个标准文档或一般协议来定义您可以摆脱什么并且仍然支持向后兼容性。即使你确实有一个 WSDL,底层实现仍然必须支持它(我想我是说 WSDL 本身并不一定告诉消费者关于应该如何使用服务以及应该做什么的完整故事期望在响应中)。如果我是你,并且我想保证向后兼容性,我会实施新版本的服务。【参考方案2】:我在这个特定的主题上花了一些时间,并在 Thomas Erl 的一本书中找到了一些指导方针,我在底部提到了这些指导方针。这是他们要说的话;
兼容更改
添加新的 WSDL 操作定义和关联的消息定义 添加新的 WSDL 端口类型定义和关联的操作定义 添加新的 WSDL 绑定和服务定义 向消息定义添加新的可选 XML Schema 元素或属性声明 减少消息定义类型的 XML Schema 元素或属性的约束粒度 向消息定义类型添加新的 XML Schema 通配符 添加新的可选 WS-Policy 断言 添加新的 WS-Policy 替代方案不兼容的更改
重命名现有 WSDL 操作定义 删除现有的 WSDL 操作定义 更改现有 WSDL 操作定义的 MEP 向现有 WSDL 操作定义添加故障消息 向消息中添加新的必需 XML 模式元素或属性声明 定义 增加 XML Schema 元素或属性声明的约束粒度 消息定义 重命名消息中的可选或必需的 XML 架构元素或属性 定义 删除可选或必需的 XML 架构元素或属性或通配符 来自消息定义 添加新的必需 WS-Policy 断言或表达式 添加新的可忽略的 WS-Policy 表达式(大部分时间)Thomas Erl 等人有一本关于这个特定主题的好书;名称是面向 SOA 的 Web 服务合同设计和版本控制。
HTH。
免责声明:正如我所提到的,这是本书作者所做的工作,我只是分享它。无论如何,我也不隶属于;只是喜欢这本书:)
【讨论】:
您好,我认为第 4 项“添加新的可选 XML 架构”绝对不能向后兼容。它仅适用于请求消息。如果您的客户端应用最佳实践并在运行时对 XML 响应启用 XSD 验证,那么任何新的可选标记都将被拒绝。请收下 我同意 Aerosteaks 的评论。向后兼容性应该建模为一个包含三列的矩阵:类似于 TypeOfChange、IsRequestMessageBackwardCompatible、IsResponseMessageBackwardCompatible 还可以通过在响应末尾添加 来实现前向兼容性。有了这个,他们可以在未来扩展。但这是不应该被过度使用的东西。 是否有客户端(库)会在运行时检查 WSDL,如果更改则失败,即使更改向后兼容?以上是关于什么是对 WSDL 契约的非破坏性或向后兼容的更改?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不破坏向后兼容性的情况下更改 DataContract 属性的类型?
AutoCloseable.close() 方法是不是破坏了 Java 的向后兼容规则