【问题标题】:Changing namespace for DataContracts in a WCF service在 WCF 服务中更改 DataContracts 的命名空间
【发布时间】:2020-07-21 12:38:05
【问题描述】:

在使用 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();
    }
}

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

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

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

【问题讨论】:

  • 是的,这实际上有很大帮助!我只需要使用魔法名称空间 URL 更新我的所有合同。我看起来并不那么漂亮,但它确实似乎有效!非常感谢:-)

标签: c# .net wcf


【解决方案1】:

看着

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 并添加这个命名空间

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 2019-04-13
    • 2021-12-28
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多