代码之家  ›  专栏  ›  技术社区  ›  Mike Atlas

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

  •  6
  • Mike Atlas  · 技术社区  · 15 年前

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

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

    这是我的手术:

    [OperationContract]
    MyResponse GetData();
    

    应该是:

    [OperationContract]
    MyResponse GetData(); 
    
    [OperationContract]
    MyResponse GetData(string filter);
    

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

    [OperationContract]
    MyResponse GetData(string filter);
    

    后一种选择似乎是最好的,根据我的参考书, 对客户的影响是零。新参数在服务处初始化为默认值。 “WCF是否将其初始化为所谓的默认值?如果是,默认值是什么?

    3 回复  |  直到 11 年前
        1
  •  13
  •   Agent_9191    15 年前

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

    最好的方法是使用选项3(只是添加新参数),并且在方法逻辑帐户中,对于那些尚未更新的客户机,它是一个空值。如果这是客户机需要更新的一个破坏性更改,请确保不会因为异常而导致整个应用程序死亡。

        2
  •  3
  •   Mike Atlas    14 年前

    您可以尝试以下操作:

    [OperationContract]
    MyResponse GetData(); 
    
    [OperationContract(Name = "GetDataByFilter")]
    MyResponse GetData(string filter);
    
        3
  •  2
  •   marc_s Anurag    15 年前

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

    事实上,这种情况经常发生,而且WCF非常擅长为您处理这些问题。只要您只引入不间断的更改,现有客户机将继续工作。

    这可以是:

    • 基于现有服务合同的新运营合同
    • 数据合同上的新非必需字段

    不过,你想做的事情是行不通的

    1. 在wcf中不能有两个同名的方法-wcf是 .NET和您不能有两个同名的方法,它们的签名不同。不起作用。您需要使用两个独立的、不同的名称。记住:您的wcf方法调用将被转换为一个WSDL(Web服务描述语言)文档来描述该服务——而wsdl不支持具有相同名称的两个操作——只是不支持签名上的差异,而且不起作用。

    2. 您不能更改现有约定,例如,您不能在事实发生后将新参数引入方法调用,而不破坏约定。

    所以你真正需要做的是:

    [OperationContract]
    MyResponse GetData(); 
    
    [OperationContract]
    MyResponse GetFilteredData(string filter);
    

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