【问题标题】:Adding a new parameter to a WCF operation: choices?向 WCF 操作添加新参数:选择?
【发布时间】:2010-12-17 15:38:16
【问题描述】:

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

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

这是我的操作:

[OperationContract]
MyResponse GetData();

应该是:

[OperationContract]
MyResponse GetData(); 

[OperationContract]
MyResponse GetData(string filter);

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

[OperationContract]
MyResponse GetData(string filter);

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

【问题讨论】:

    标签: wcf web-services wsdl optional-parameters


    【解决方案1】:

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

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

    【讨论】:

    • 这是一个非破坏性的变化。我会优雅地处理过滤器是否为空或为空。
    • @Mike:我不认为它是不间断的 - 突然间,你的方法“GetData”现在需要一个原始调用者没有提供的参数......
    • @marc_s:由于 WCF 的灵活性,只要值可以为 null,不向其传递内容的客户端仍然可以工作。这就是在 WCF 中允许版本不匹配的优势。
    【解决方案2】:

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

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

    这可以是:

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

    但是,您尝试做的事情是行不通的

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

    2. 您不能更改现有合同,例如在不违反约定的情况下,您不能事后在方法调用中引入新参数。

    所以你真正需要做的是:

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

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

    【讨论】:

    • 我实际上同意了你的建议,但 Agent_9191 的回答对我原来的问题更正确,所以我接受了他的回答并 +1 了你的。
    【解决方案3】:

    你可以试试这个:

    [OperationContract]
    MyResponse GetData(); 
    
    [OperationContract(Name = "GetDataByFilter")]
    MyResponse GetData(string filter);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多