我正在维护SOAP Web服务(ASP.NET 2.0版),我必须进行一些修改,以修改特定方法的返回值。
在不破坏现有实现的情况下,通常接受的方法是什么。
我最初的想法是,以下一切都是可能的。
a)在现有Web服务中提供新版本特定方法,例如getPerson_v1.4
b)提供带有新版本号的.asmx文件的完整副本,例如HTTP:/www.example.com/AdminWS_V1_4.asmx。这不是我喜欢的想法,因为该服务有超过50种方法,并且复制代码以更改2/3方法似乎是太多重复的代码。
c)重写Web服务构造函数以允许传入版本号。这似乎不起作用,并且在反思时我不确定如何在WSDL中表示
是否有普遍接受的方式,或者人们根据他们在这方面的经验提供建议。
答案 0 :(得分:7)
我们部署到版本目录,例如:
http://www.example.com/soap/v1/ http://www.example.com/soap/v2/ http://www.example.com/soap/v3/
等
答案 1 :(得分:6)
在一般情况下,对Web服务进行版本控制不仅仅是对方法名称和.asmx文件名进行版本控制。理想情况下,Web服务(其WSDL)的接口应该是永久合同,并且永远不应该更改。其中一个含义是不需要更改功能的客户端永远不需要更改,因此永远不需要重新测试。
您应该创建一个包含已更改操作的新合同,而不是违反现有合同。该合同可以“继承”现有合同,即您可以“将方法添加到最后”。但是请注意,您还应该将新合同放入新的XML命名空间 - 命名空间基本上标识了WSDL,并且更改了命名空间,但更改WSDL将是一个谎言。
然后,您应该在新端点(.asmx文件)中实现此新合同。这是否在不同的目录中,甚至在不同的网站上并不重要。重要的是,想要新功能的客户可以在新URL上引用新的WSDL,并在新的URL上调用新服务,并且很高兴。
请注意,更改现有合同的一个效果是,下次执行“更新Web引用”时,您将更改客户端代理类的代码。在大多数商店中,更改代码需要重新测试和重新部署。因此,您应该将“仅添加方法”视为“仅添加一些必须进行测试和部署的客户端代码”,即使现有客户端代码不使用新方法。
答案 2 :(得分:2)
我刚才想到了另一个看起来很干净的解决方案。
我可以检查包含在SOAP标头中的版本号,并假设现有版本号(如果未提供)。
然后,我可以在不更改方法签名的情况下使代码对于不同版本的行为有所不同。这可能是因为Web服务的返回值是XML对象,因此方法签名保持不变,但XML的内容会根据版本发生变化。
答案 3 :(得分:2)
我正在开发与webservices相同的版本问题。我们让用户在标头中传递架构版本号。他们告诉我们他们想要回复哪个版本的XML模式。这样,我们总是向后兼容,代码不重复。
在我的工作中,我们不能告诉客户他们在我们发布版本时必须将URL切换到web服务。在大公司中,像URL一样小的变化可能需要数月的测试。我觉得你不应该破坏你的客户联系。我们所做的是,为最新版本添加新功能。当客户端要求新功能时,如果他们需要,他们将被迫升级到最新的架构。
答案 4 :(得分:0)
除非您使用每个新版本更改大多数方法签名,否则我将使用(a) - 版本化的方法名称。这就是我们的提供商如何做到这一点,它对我们来说很好。