向WCF操作添加新参数:选项?

向WCF操作添加新参数:选项?,wcf,web-services,wsdl,optional-parameters,Wcf,Web Services,Wsdl,Optional Parameters,处理向现有操作添加新(可选)参数而无需客户端更新其WSDL的最佳方法是什么?我不想更新名称空间来描述服务契约的新版本,因为这应该与旧客户端向后兼容 我应该添加一个带有新参数的新操作作为重载吗?或者我应该只将参数添加到现有操作中 以下是我的操作: [OperationContract] MyResponse GetData(); 如果是: [OperationContract] MyResponse GetData(); [OperationContract] MyResponse GetD

处理向现有操作添加新(可选)参数而无需客户端更新其WSDL的最佳方法是什么?我不想更新名称空间来描述服务契约的新版本,因为这应该与旧客户端向后兼容

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

以下是我的操作:

[OperationContract]
MyResponse GetData();
如果是:

[OperationContract]
MyResponse GetData(); 

[OperationContract]
MyResponse GetData(string filter);
或者更简单地说,将其更改为:

[OperationContract]
MyResponse GetData(string filter);

后一个选项似乎是最好的,根据我的参考书,“对客户端的影响是无的。新参数在服务中被初始化为默认值。”WCF是否将其初始化为所谓的默认值?如果是这样的话,默认值是什么?

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

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

这可以是:

  • 现有服务合同上的新运营合同
  • DataContract上的新非必填字段
不过,你想做的是行不通的

  • 在WCF中不能有两个同名的方法-WCF是而不是.NET,并且不能有两个同名的方法仅通过签名不同。不起作用。您需要使用两个不同的名称。请记住:您的WCF方法调用将被转换为WSDL(web服务描述语言)文档来描述服务——WSDL不支持具有相同名称的两个操作——只是签名的差异不受支持且不起作用

  • 您不能更改现有约定,例如,在不破坏约定的情况下,您不能在事后将新参数引入方法调用

  • 所以你真正需要做的是:

    [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。