我们有一个被许多其他进程使用的Web服务。它采用一个对象(由XSD生成)作为参数。该对象中的一个属性(日期时间)现在可以为null。
问题是:我现在是否必须找到引用此Web服务的所有流程并更新它们的引用,以便它们继续工作?
这是一个棘手的问题。
我认为你应该没事,因为你没有删除或添加新的参数到接口。
这只是对现有参数的一个简单更改,在我看来,你只是放松了这里的限制。不是强制参数不能接受null,而是说现在是。
我认为现有进程一定已经为该dateTime属性设置了不可为null的值?因此,对于要利用更改的新流程,它们必须更新引用,否则不需要更改。
不过,更改服务合同通常是个坏主意。你有没有考虑过在你的发行说明中包括这一变化?让你的客户意识到并能够采取适当的措施。
以下是另一个可能给您带来麻烦的突破性更改列表。
- 删除操作
- 更改操作名称
- 删除操作参数
- 添加操作参数
- 更改操作参数名称或数据类型
- 更改操作的返回值类型
- 通过显式使用.NET属性或自定义序列化代码更改参数类型(数据约定)或操作(消息约定)的序列化XML格式
- 修改服务操作编码格式(RPC编码与文档文本)
如果仅使属性从不可为null变为可为null,则更改服务约定需要更新服务引用。
您可以创建一个共享项目来维护服务引用,而不是每个项目都使用服务来创建自己的引用。这样,你就不需要经历所有的项目和应用程序,也不需要为每一个项目和应用都经历这个过程。
更好的解决方案仍然是在一个单独的项目/程序集中定义POCO,并在服务和客户端引用它。WCF和VS足够聪明,可以识别出它不必为服务类创建代理类,而是将使用单独程序集中的POCO。如果只在添加/删除类或更改服务接口时更改服务公开的类中的属性,则甚至不必更新服务引用。