在不要求客户端更新其WSDL的情况下,处理向现有操作添加新(可选)参数的最佳方法是什么?我不想更新命名空间来描述新版本的服务合同,因为这应该与旧客户端向后兼容。
我是否应该使用新参数添加新操作作为重载?或者我应该只将参数添加到现有操作?
这是我的操作:
[OperationContract]
MyResponse GetData();
应该是:
[OperationContract]
MyResponse GetData();
[OperationContract]
MyResponse GetData(string filter);
或者更简单地说,只需将其更改为:
[OperationContract]
MyResponse GetData(string filter);
后一个选项似乎最好,根据我的参考书,“对客户端的影响是无。新参数在服务时初始化为默认值。”WCF是否将其初始化为所谓的默认值?如果是,那么默认值是什么?
答案 0 :(得分:13)
要考虑的一件事是您不能拥有两个具有相同名称的OperationContracts。它序列化的方式会引发错误。
最好的方法是使用选项3(仅添加新参数)并在方法逻辑帐户中使用它,对于那些尚未更新的客户端,它是空值。如果这是客户需要更新的重大更改,请确保不会因为异常而导致整个应用程序死亡。
答案 1 :(得分:3)
那么,在使用现有合同之后对其进行更改实际上违反了所有面向服务的规则;你永远不应该违反现有的合同。
实际上,这种情况经常发生,WCF非常适合为您处理。只要您只引入不间断的更改,现有客户端将继续工作。
这可以是:
虽然
,但你想要做的事情是行不通的在WCF中不能有两个具有相同名称的方法 - WCF 不是 .NET,并且您不能让两个同名的方法只有它们的签名不同。不行。您需要使用两个独立的不同名称。请记住:您的WCF方法调用将被转换为WSDL(Web服务描述语言)文档来描述服务 - 而且WSDL根本不支持具有相同名称的两个操作 - 只是不支持签名的差异而且不起作用
您无法更改现有合约,例如事后,你不能在方法调用中引入新参数,而不会违反合同。
所以你真正需要做的是:
[OperationContract]
MyResponse GetData();
[OperationContract]
MyResponse GetFilteredData(string filter);
您建议的任何其他更改将a)违反合同,或b)根本不在WCF中工作:
答案 2 :(得分:3)
你可以试试这个:
[OperationContract]
MyResponse GetData();
[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);