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 属性上设置名称)。

只有匹配的属性会被反序列化,因此在服务器端添加 属性 不会影响客户端。