在WCF服务中向对象添加属性中断客户端

时间:2015-12-18 14:17:24

标签: c# wcf soap wsdl

我们使用C#代码使用WCF服务。通过右键单击"添加服务引用"在Visual Studio中生成客户端。并将其指向WSDL。

最近,WCF提供程序向其序列化的对象之一添加了一些属性。课程来自

public class MyClass
{
        public string Foo { get; set; }
        public string Baz { get; set; }
        public string Zed {get; set; }
}

到此:

public class MyClass
{
        public string Foo { get; set; }
        public string Bar { get; set; } //<= New Property
        public string Baz { get; set; }
        public string Zed {get; set; }
}

最后,这导致BazZed在反序列化时突然开始为null,直到我们更新了服务引用。实际上,真实对象在Bar之后按字母顺序排列了大约20个属性,它们都是空的(或者0用于整数,false用于bool等。)

反序列化失败似乎是一种奇怪的方式。它没有抛出异常或忽略它对它没有任何了解的新属性....它只是使每个属性在新的属性后按字母顺序反序列化为默认值。

所以我的问题是,这里发生了什么,我该如何预防呢?最好是,我喜欢某种设置,让客户告诉它“忽略新的属性”,&#34;但是告诉服务提供商他们如何防止未来发生变化也很好。

2 个答案:

答案 0 :(得分:2)

MSDN has an article列出了数据库的序列化顺序。该文件的一个关键点:

  

当前类型的数据成员,没有Order属性   DataMemberAttribute属性设置,以按字母顺序排列顺序。

因此,如果添加新属性,而没有DataMemberAttribute的Order-property,则按字母顺序排列该属性。

基于discussion here,您唯一的选择是:

  1. 将序列化程序更改为其他内容
  2. 确保XML中元素的顺序与属性的顺序相匹配。也许你总是可以使用DataMemberAttribute的Order-property?

答案 1 :(得分:0)

确保您的dll排队,我在过去看到过一些非常时髦的问题,其中服务的一方指向过时的dll

还要记住the fundamentals of data contracts