【问题标题】:version wcf for backward compatibility用于向后兼容的 wcf 版本
【发布时间】:2015-10-21 12:32:32
【问题描述】:

我有一个服务有以下方法:

[ServiceContract]
public interface TestContract
{
  [OperationContract]
  void GetTest(Test test);
}

现在在我的新服务合同中,类型 Test 已移动到新名称 TestNew 的不同命名空间中 这是我的新服务合同:

 public interface TestContract
{
  [OperationContract]
  void GetTest(TestNew test);
}

如何在不破坏现有客户端的情况下实施服务。这意味着无需现有客户端更新其服务引用即可实现向后兼容性。

基本上,参数的类型发生了变化,这是一个突破性的变化。因为,我现在有新老客户。有什么方法可以更改我的服务合同,而无需更改新老客户的服务参考?我正在考虑在参数的序列化/反序列化过程中拦截某处

【问题讨论】:

标签: c# web-services wcf


【解决方案1】:

您可以将TestNow 定义为子类(以及TestKnownType)并且不更改方法签名,或者您可以通过更改方法名称来添加新的Action(保留旧的) 或使用OperationContract 属性上的Name 属性。

更常见的突破性更改方法是定义一个新端点。例如:http://foo/someservice/2014-05 用于第一个版本,http://foo/someservice/2015-10 用于新版本。

【讨论】:

  • 基本上parameter的类型发生了变化,这是一个突破性的变化。因为,我现在有新老客户。有什么方法可以更改我的服务合同,而无需更改新老客户的服务参考?我正在考虑在参数的序列化/反序列化过程中拦截某处
  • 呃……是吗?我列出了三种不需要以任何方式更改配置的方法。 (继承旧数据合同,添加为新方法,或添加具有相同操作的 backcompat 方法)。
  • 原因是我不能继承旧数据合约,我需要它在同一个操作中
  • 子类化旧的数据契约可以让您保持相同的操作。您只需检查参数类型以查看它们是否正在调用更新。 void foo(Base p) { var d = p as Derived; if (d != null) { /* new contract */ } else { /* old contract } }
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
相关资源
最近更新 更多