7

在不要求客户端更新其 WSDL 的情况下,处理向现有操作添加新(可选)参数的最佳方式是什么?我不想更新命名空间来描述服务合同的新版本,因为这应该与旧客户端向后兼容。

我应该添加一个带有新参数的新操作,作为重载吗?或者我应该只是将参数添加到现有操作中?

这是我的操作:

[OperationContract]
MyResponse GetData();

应该是:

[OperationContract]
MyResponse GetData(); 

[OperationContract]
MyResponse GetData(string filter);

或者更简单地说,只需将其更改为:

[OperationContract]
MyResponse GetData(string filter);

后一种选择似乎最好,根据我的参考书,“对客户端的影响是没有的。新参数在服务处被初始化为默认值。 ”WCF是否将其初始化为所谓的默认值?如果是这样,默认值是多少?

4

3 回答 3

14

需要考虑的一件事是,您不能有两个具有相同名称的 OperationContract。它的序列化方式会引发错误。

最好的方法是使用选项 3(只是添加新参数)并在方法逻辑中说明它对于那些尚未更新的客户端来说是一个空值。如果这是客户端需要更新的重大更改,请确保整个应用程序不会因为异常而死掉。

于 2009-11-17T22:10:54.387 回答
4

好吧,在使用后更改现有合同确实违反了所有面向服务的规则;你永远不应该违反现有的合同。

实际上,这种情况经常发生,WCF 可以很好地为您处理。只要您只引入非破坏性更改,现有客户端将继续工作。

这可以是:

  • 现有服务合同的新运营合同
  • DataContract 上的新非必填字段

但是,您尝试做的事情不会奏效

  1. 您不能在 WCF 中有两个同名的方法 - WCF不是.NET,并且您不能有两个同名的方法仅通过签名不同。不工作。您需要使用两个独立的不同名称。请记住:您的 WCF 方法调用将被翻译成 WSDL(Web 服务描述语言)文档来描述服务 - 而 WSDL 根本不支持具有相同名称的两个操作 - 只是不支持签名不同,并且不会工作.

  2. 您不能更改现有的合同,例如,您不能在事后将新参数引入方法调用,而不破坏合同。

所以你真正需要做的是:

[OperationContract]
MyResponse GetData(); 

[OperationContract]
MyResponse GetFilteredData(string filter);

您建议的任何其他更改将 a) 违反合同,或 b) 在 WCF 中根本不起作用:

于 2009-11-17T22:09:51.120 回答
3

你可以试试这个:

[OperationContract]
MyResponse GetData(); 

[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);
于 2010-10-13T18:59:25.480 回答