代码之家  ›  专栏  ›  技术社区  ›  CRice

WCF版本控制:更新属性名称空间并支持以前的名称空间

  •  0
  • CRice  · 技术社区  · 16 年前

    我有三个WCF服务(.svc),它们为SOAP消息生成.wsdl引用。

    例如,假设命名空间的一部分需要为所有ServiceContract、OperationContract、DataContract属性进行更改

    [DataContract(Namespace = "http://old.com.au/types/")]
    

    [DataContract(Namespace = "http://new.com.au/types/")]
    

    我怎么还能支持拥有旧服务引用的客户机(不需要更新,因为他们可能没有时间立即更新),并允许获得新服务引用的客户机获得新的命名空间? 没有任何服务在更改,只有名称空间在更改。

    到目前为止,我已经阅读了很多内容,但下面的文章建议可以从ServiceHostFactory更改服务类型: http://blog.ranamauro.com/2008/07/hosting-wcf-service-on-iis-site-with_25.html

    这意味着创建每个契约中的两个(将尽可能多的实现放在一个地方),并在运行时确定要使用哪种服务类型。这会在我的场景中造成一些混乱。

    有没有一个替代的,好的方法来完成这一点,或者是预期这种事情不应该做,让客户端更新到新的名称空间。

    1 回复  |  直到 16 年前
        1
  •  3
  •   VinayC    16 年前

    在IMO中,您需要在(最好)旧端点为以前的客户机托管旧服务,并在新端点拥有新服务。当所有旧客户机迁移到新版本时,可以删除旧服务。 例如,您可以使用继承来减少您的工作量

    [DataContract(OldNameSpace)]
    ClassA {
     ...
    }
    
    [DataContract(NewNameSpace)]
    ClassB : ClassA {
    }
    

    编辑:放置示例接口和实现

    public interface IOldContract
    {
        ClassA GetFoo();
        void DoBar(ClassA a);
    }
    

    现在你可以选择新合同

    public interface INewContract
    {
        ClassB GetFoo();
        void DoBar(ClassB b);
        ClassB GetMix(ClassB a);
    }
    

    public interface INewContract2 : IOldContract
    {
        ClassB GetFoo2();
        void DoBar2(ClassB b);
        ClassB GetMix2(ClassB b);
    }
    

    我倾向于以后的变更(因为新合同和旧合同保持一致)。但在您的例子中,您可以选择前者,因为您无论如何都要暴露两个端点。 现在您需要修改服务实现,如下所示:

        public class ServiceImplementation : INewContract2
    {
        #region INewContract2 Members
    
        public ClassB GetFoo2()
        {
            // Your old implementation goes here 
        }
    
        public void DoBar2(ClassB b)
        {
            DoBar(b);
        }
    
        public ClassB GetMix2(ClassB b)
        {
            return GetMixHelper(b);
        }
    
        #endregion
    
        #region IOldContract Members
    
        public ClassA GetFoo()
        {
            return GetFoo2();
        }
    
        public void DoBar(ClassA a)
        {
            // You old implementation goes here
        }
    
    
        public ClassA GetMix(ClassA a)
        {
            return GetMixHelper(a);
        }
    
        #endregion
    
        private ClassB GetMixHelper(ClassA a)
        {
            // Your old implementation goes here
        }
    
    }
    

    我希望你明白我的意思。即使在这里,您也可以选择多种代码组织。您可以有两个框架服务实现类—一个用于旧契约,另一个用于新契约。两者实际上都将功能委托给助手类(这是您当前的实现)。