【发布时间】:2010-10-14 04:56:54
【问题描述】:
随着时间的推移,您的网络服务可能会发生变化,您会做什么以及如何管理变化? (不同版本;添加更多功能,修改甚至删除功能等)
【问题讨论】:
标签: c# web-services api soap
随着时间的推移,您的网络服务可能会发生变化,您会做什么以及如何管理变化? (不同版本;添加更多功能,修改甚至删除功能等)
【问题讨论】:
标签: c# web-services api soap
通常,对于非破坏性更改(主要是添加方法),您可以在同一端点扩展服务合同/实施。同样,当我说非破坏性更改时,它意味着句法和语义上的更改。
否则,最简洁的方法是将新服务版本一起托管在不同的端点上。让您的客户有机会在关闭旧版本之前逐步迁移到新版本(如果需要)。很多时候,您可以在后台使用大部分服务实现并减少工作量。
此外,有时服务更改不是在方法中,而是在输入/输出数据中。有时可以通过对数据结构进行版本控制来解决这些问题。例如,接受 XML 输入的函数可能会开始支持输入中的其他数据/标签。在这种情况下,您可以将其托管在同一端点上,然后从数据中找出客户端正在发送什么。虽然,在这种情况下,我更希望有另一种方法或新的终点。
最后,您还可以在服务接口中使用方法,该方法可以发出版本信息或验证客户端提供的版本信息,以告诉它服务实现是否与其构建的任何服务合同兼容。这允许客户端在不兼容或配置不正确的情况下提供友好的消息。这种情况下的另一种变化可能是向客户端返回兼容服务版本的端点地址(兼容服务的动态发现)。
【讨论】:
我会添加一个新端点,它可以在后端使用相同的代码,但只返回不同的输出。
如果更改足够小(比如只是一个新属性),那么理想情况下,您可以只更新现有服务端点的输出;将新属性添加到您的输出中并让老客户忽略它。但问题是肥皂的消费者(尤其是在 .NET 世界中)使用生成静态代理的工具,这些代理非常难以更改。
【讨论】: