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