【发布时间】:2011-07-21 06:20:09
【问题描述】:
我有一个适用于客户端 v1 的 wcf 合同。
现在我正在开发服务 v2,我想将一些字段标记为已弃用,因此客户端 v1 将看到并使用它们,而客户端 v2 将忽略它们。
是否有针对此问题的最佳做法?我应该使用 WCF 中的任何现有属性吗?
谢谢。
【问题讨论】:
标签: c# wcf deprecated datacontract
我有一个适用于客户端 v1 的 wcf 合同。
现在我正在开发服务 v2,我想将一些字段标记为已弃用,因此客户端 v1 将看到并使用它们,而客户端 v2 将忽略它们。
是否有针对此问题的最佳做法?我应该使用 WCF 中的任何现有属性吗?
谢谢。
【问题讨论】:
标签: c# wcf deprecated datacontract
您可以将旧属性装饰为[Obsolete],但客户端仅在使用 DLL 引用而不是服务/Web 引用 (WSDL) 时才能看到它们。 [Obsolete] 装饰不会传递给使用 WSDL 生成代理的客户端。
就 WCF 版本控制而言,一旦您发布了接口,就不能删除任何方法,或者根据合同,您真的不应该删除任何属性。如果您希望新客户端使用它们,您可以发布一个新接口并创建一个单独的 DTO 类。
【讨论】:
[Obsoltete]。已更正。
在我们这边,我们通常通过命名空间对操作进行版本控制。当一个操作被弃用时,我们只需在描述中添加一个弃用注释,客户端可以通过 wsdl 看到。我们会通知我们的客户,并让他们了解已弃用的操作及其到期日期。
【讨论】:
我同意@Aliostad 的观点,一般而言,您不应从服务合同中删除操作,因为它引入了重大更改,因此应在单一版本的 API 中避免此类操作。
但是,如果您想通知客户/消费者一些计划中的更改或有任何其他需要在操作合同中添加某些“额外”信息,您可以查看IWsdlExportExtension 接口,创建一个自定义属性实现它并注释特定的操作。
您可以查看this article以获取详细参考。
【讨论】: