WCF Versioning宁静的方式问题

时间:2010-04-21 14:56:06

标签: wcf versioning backwards-compatibility

我在Icontact和wcf服务中有两种方法,我想为新要求版本一种方法。 并希望现有客户调用旧代码。和新客户端调用新的更改方法和现有方法以实现向后兼容。

代码:

[ServiceContract(Namespace = "http://www.testk.com/1/11", Name = "cService")]
public interface ICService
{
   [OperationContract(Name="GetWorkingDetails")]
   void GetWorkingDetails(int a);

   void GetList(int a);
}

//service Implementation
public class MyService : ICService
{
   [WebGet]
   void GetWorkingDetails(int a)
   {
     ////
   }

   [WebGet]
   void GetList(int a)
   {
      ////
   }
}

这里我正在版本化.....

[ServiceContract(Namespace = "http://www.testk.com/2/11", Name = "cService")]
  public interface ICServicev1
{
    [OperationContract(Name="GetWorkingDetails")]
    void GetWorkingDetailsV2(int a);
}

<endpoint address="" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="" name="v0"
          contract="ICService" />
<endpoint address="r1" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="" name="v1"
          contract="ICServicev1" />

当我调用现有方法时,它工作得很好,当我打电话给service.svc/r1/GetWorkingDetails时,效果很好。但我还想打电话给以前合同中的service.svc/r1/GetList。如何调用它以实现向后兼容性。

THX

1 个答案:

答案 0 :(得分:0)

我猜service.svc/r1/GetList是不可能的。因为您没有继承ICServiceICServicev1(即public interface ICServicev1 : ICService)。事实上,你可以通过以下方式实现这一目标。

1)使用ICServiceCommon方法创建void GetList(int a);界面。

2)继承ICServiceCommon ICServiceICServicev1 [public interface ICService : ICServiceCommonpublic interface ICServicev1 : ICServiceCommon]

ICService界面

3)实施与ICServicev1班级[MyService]的public class MyService : ICService, ICServicev1service.svc/GetWorkingDetails service.svc/GetList 接口。

旧版客户端调用相同的方法。 [向后兼容]

service.svc/r1/GetWorkingDetailsV2
service.svc/r1/GetList

新客户可以致电

{{1}}

希望这种方法很有用。