假设我有一个web服务,它返回所有方法的类,通知客户端进程的状态,例如:
15 * * * * * java -jar /home/scarter/scripts/java/autobackup.jar
现在我们要为此类添加属性,而不强制所有使用我们服务的客户端更新其软件。这可能吗?
例如:
public class WsResult {
string result; // either "error" or "ok"
}
我正在寻找WCF和ASMX的答案。
答案 0 :(得分:5)
<强> WCF 强>
有可能。您只需添加一个新属性即可,只要不需要此新属性即可。有关详细信息,请参阅Best Practices: Data Contract Versioning文章的第8点。
如果您需要处理往返方案,您应该阅读IExtensibleDataObject
接口。当数据从服务器发送到客户端并且预期它将被发回时,发生往返。有关详细信息,请参阅Forward-Compatible Data Contracts文章。
<强> ASMX 强>
ASMX的情况是一样的。您可以添加新属性,所有客户端都应该可以使用。在这种情况下,您还可以使用IExtensibleDataObject
界面。
最终评论
这个答案基于VS 2015的实证测试。我强烈建议你这样做,即:编写简单的WCF / ASMX服务器和客户端,并验证我描述的行为。我花了几分钟才这样做。或者甚至更好,您可以使用现有的服务。
我建议您使用其他测试,因为您可能正在使用某些非默认配置来更改WCF / ASMX服务的默认行为,因此最好进行检查。我不知道这种配置,但你永远不知道。
答案 1 :(得分:-1)
使用WCF,您实际上可以在客户端和服务器端拥有不同的类,这通常也会在使用添加服务引用 UI时发生。使这项工作的技巧是在DataContract
属性上设置命名空间和名称(如果成员名称不同,甚至可能在DataMember
属性上设置名称。)
只有匹配的属性才会被反序列化,因此在服务器端添加属性不会影响客户端。