在WCF服务中更改DataContracts的命名空间

时间:2020-07-21 12:38:05

标签: c# .net wcf

在使用WCF服务对用C#编写的客户端/服务系统进行重大重构之后,我们将所有服务接口合同移至了新的名称空间,即从以下类似的地方移入了

namespace Old.Framework.Name
{
    [DataContract]
    public class ServiceEntriesResult
    {
        [DataMember]
        public string SomeData { get; set; }
    }

    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        ServiceResult GetServiceData();
    }
}

对此:

namespace New.Framework.Name
{
    [DataContract]
    public class ServiceEntriesResult
    {
        [DataMember]
        public string SomeData { get; set; }
    }

    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        ServiceResult GetServiceData();
    }
}

唯一的区别是名称空间,但它会影响所有参数和返回数据结构以及服务接口。

现在,我们非常希望使新客户与旧服务兼容。目前,如果我尝试使用新客户端从旧服务中读取内容,则会得到空结果。我可以看到在服务器端触发了正确的服务调用,因此显然可以正确映射某些内容,但是返回数据对象为null。

关于如何解决此问题的任何想法?这有可能吗?

1 个答案:

答案 0 :(得分:0)

看着

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-names

DataContractSerializer compatibility after namespace changed

似乎默认名称空间生成为:

http://schemas.datacontract.org/2004/07/My.Namespace

因此,就我而言,我需要在DataContract属性中添加以下内容:

namespace New.Framework.Name
{
    [DataContract(Namespace = "http://schemas.datacontract.org/2004/07/Old.Framework.Name")]
    public class ServiceEntriesResult
    {
        [DataMember]
        public string SomeData { get; set; }
    }

    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        ServiceResult GetServiceData();
    }
}

对于我来说,这似乎很好用,所以我只需要遍历所有DataContracts并添加此命名空间