在使用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。
关于如何解决此问题的任何想法?这有可能吗?
答案 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并添加此命名空间