C# 用于向后兼容性的wcf版本

C# 用于向后兼容性的wcf版本,c#,web-services,wcf,C#,Web Services,Wcf,我有一个具有以下方法的服务: [ServiceContract] public interface TestContract { [OperationContract] void GetTest(Test test); } 现在,在我的新服务合同中,类型Test已被移动到具有新名称的不同名称空间TestNew 这是我的新服务合同: public interface TestContract { [OperationContract] void GetTest(TestNew

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

[ServiceContract]
public interface TestContract
{
  [OperationContract]
  void GetTest(Test test);
}
现在,在我的新服务合同中,类型
Test
已被移动到具有新名称的不同名称空间
TestNew
这是我的新服务合同:

 public interface TestContract
{
  [OperationContract]
  void GetTest(TestNew test);
}
如何在不破坏现有客户端的情况下实现服务。这意味着在不让现有客户机更新其服务引用的情况下实现向后兼容性


基本上,参数的类型发生了变化,这是一个突破性的变化。从那以后,我现在有了新老客户。我有没有办法在不必更改新旧客户的服务参考的情况下更改我的服务合同?我在考虑在参数的序列化/反序列化过程中的某个地方进行拦截

您可以将
TestNow
定义为一个子类(和
Test
KnownType
),而不更改方法签名,或者您可以通过更改方法的名称(保留旧名称)来添加新的
操作
或者使用
OperationContract
属性上的
Name
属性


对于突破性更改,更常见的方法是只定义一个新端点。例如:对于第一个版本和新版本。

基本上,
参数的类型发生了变化,这是一个突破性的变化。从那以后,我现在有了新老客户。我有没有办法在不必更改新旧客户的服务参考的情况下更改我的服务合同?我在想在参数的序列化/反序列化过程中拦截某个地方。。。对我列出了三种不需要以任何方式更改配置的方法。(将旧数据协定子类化、添加为新方法或添加具有相同操作的backcompat方法)。原因是我无法将旧数据协定子类化,并且在相同操作中需要它将旧数据协定子类化可以让您保留相同的操作。您只需检查参数类型,查看它们是否正在使用更新进行调用
void foo(Base p){var d=p作为派生;if(d!=null){/*new contract*/}else{/*old contract}