向WCF操作添加新参数:选项?
处理向现有操作添加新(可选)参数而无需客户端更新其WSDL的最佳方法是什么?我不想更新名称空间来描述服务契约的新版本,因为这应该与旧客户端向后兼容 我应该添加一个带有新参数的新操作作为重载吗?或者我应该只将参数添加到现有操作中 以下是我的操作:向WCF操作添加新参数:选项?,wcf,web-services,wsdl,optional-parameters,Wcf,Web Services,Wsdl,Optional Parameters,处理向现有操作添加新(可选)参数而无需客户端更新其WSDL的最佳方法是什么?我不想更新名称空间来描述服务契约的新版本,因为这应该与旧客户端向后兼容 我应该添加一个带有新参数的新操作作为重载吗?或者我应该只将参数添加到现有操作中 以下是我的操作: [OperationContract] MyResponse GetData(); 如果是: [OperationContract] MyResponse GetData(); [OperationContract] MyResponse GetD
[OperationContract]
MyResponse GetData();
如果是:
[OperationContract]
MyResponse GetData();
[OperationContract]
MyResponse GetData(string filter);
或者更简单地说,将其更改为:
[OperationContract]
MyResponse GetData(string filter);
后一个选项似乎是最好的,根据我的参考书,“对客户端的影响是无的。新参数在服务中被初始化为默认值。”WCF是否将其初始化为所谓的默认值?如果是这样的话,默认值是什么?好吧,在现有合同被使用后更改它确实违反了面向服务的所有规则;你永远不应该违背现有的合同 实际上,这种情况经常发生,WCF非常适合为您处理这种情况。只要您只引入非破坏性更改,现有客户机将继续工作 这可以是:
- 现有服务合同上的新运营合同
- DataContract上的新非必填字段
[OperationContract]
MyResponse GetData();
[OperationContract]
MyResponse GetFilteredData(string filter);
您建议的任何其他更改将a)破坏合同,或b)在WCF中根本不起作用:需要考虑的一点是,您不能有两个同名的运营合同。它序列化的方式将抛出一个错误 最好的方法是使用选项3(只需添加新参数),并在方法逻辑中说明,对于那些尚未更新的客户机,它是一个空值。如果这是一个突破性的更改,客户端需要进行更新,请确保整个应用程序不会因为异常而死亡。您可以尝试以下方法:
[OperationContract]
MyResponse GetData();
[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);
这是一个不间断的变化。我将优雅地处理筛选器是否为null或空。@Mike:我认为它不是非中断的-突然,您的方法“GetData”现在需要一个原始调用方没有提供的参数。@marc_s:由于WCF的灵活性,只要该值可以为null,不向其传递某些内容的客户端仍然可以工作。这就是允许在WCF中出现版本不匹配的优点。实际上我同意你的建议,但对于我最初的问题,代理9191的回答更为正确,所以我接受了他的回答,并对你的回答加1。