Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services WCF DTO版本_Web Services_Wcf - Fatal编程技术网

Web services WCF DTO版本

Web services WCF DTO版本,web-services,wcf,Web Services,Wcf,我现在有一些服务返回带有以下字段的dto: [DataMember] public int Id { get; set; } [DataMember] public string Name { get; set; } 我还想通过添加以下属性为该服务添加更多内容: [DataMember] public virtual DateTime StartDate { get; set; } 不过,我无法向这些服务的消费者进行更新,因为客户自己会这样做 我的问题是-老客户能跳过这些新的属性吗?新的属性

我现在有一些服务返回带有以下字段的dto:

[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
我还想通过添加以下属性为该服务添加更多内容:

[DataMember]
public virtual DateTime StartDate { get; set; }
不过,我无法向这些服务的消费者进行更新,因为客户自己会这样做

我的问题是-老客户能跳过这些新的属性吗?新的属性利用了它们,或者序列化会成为新属性的一个问题吗


w://

只要旧属性没有改变(新属性被标记为可选),您就可以了


也就是说,您应该发布新的契约,让客户机重新生成服务引用,或者将新版本部署到不同的端点,以便在他们准备切换时,强制他们指向新的端点

据我所见,DataContractSerializer只为反序列化时未找到的属性输入null。这使得跟踪一些bug变得相当棘手——有时我更希望它更严格,并给出一个例外

考虑的另一个选项是对原始DTO进行子类化,以创建新的派生类。

为了使序列化正常工作,您需要为具有以下属性的超类型指定可用的派生类:

[DataContract]
[KnownType(typeof(DerivedDTO))]
public class OriginalDTO

在使用附加属性的代码中,需要将对象强制转换为deriveddt才能访问该属性(我使用as关键字,并在使用它之前检查结果引用是否为null)

只要新成员
StartDate
未声明为必填字段,那么这将不起作用:

[DataMember(IsRequired="True")]
public virtual DateTime StartDate { get; set; }

但是,只要你省去了
IsRequired=True
,你就应该没事了;我不喜欢它,所以我不得不恢复所有内容,然后重新发布到一个新的端点-所以我想这是正确的答案:)谢谢大家如此快速的响应!:)我将对此进行测试-我不希望每个版本的应用程序都有不同的端点。:)