2009-11-17 30 views
6

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

我应该用新参数添加一个新的操作吗?或者,我应该只是将参数添加到现有的操作?

这里是我的操作:

[OperationContract] 
MyResponse GetData(); 

它应该是:

[OperationContract] 
MyResponse GetData(); 

[OperationContract] 
MyResponse GetData(string filter); 

或者更简单地说,只是把它改成这样:

[OperationContract] 
MyResponse GetData(string filter); 

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

回答

13

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

最好的方法是使用选项3(仅添加新参数),并在方法逻辑帐户中对于尚未更新的客户端为空值。如果这是客户需要更新的重大更改,请确保不会由于例外而导致整个应用程序死掉。

+2

这是一个不间断的变化。我会处理,如果过滤器无效或空的优雅。 – 2009-11-17 22:13:12

+0

@Mike:我不认为它没有突破 - 突然,你的方法“GetData”现在预计一个参数并不是由原来的调用者提供的...... – 2009-11-18 06:24:08

+2

@marc_s:由于WCF的灵活性在值可以为null的情况下,不向其传递任何内容的客户端仍然可以工作。这是WCF中允许版本不匹配的优点。 – 2009-11-18 10:55:54

2

那么,在现有合同被使用后更改现有合同实际上违反了所有服务导向规则;您绝对不应该曾经打破现有合同。

在现实中,这种情况相当频繁,而WCF是关于处理,对你。只要你只引入非重大的变动,现有客户将继续工作就不错了。

这可以是:

  • 现有的服务合同上一个新的经营合同
  • 上一个新的非必需领域的DataContract

什么你正在试图做的是行不通的,虽然

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

  2. 您无法更改现有合同,例如,您不能在事实之后将新参数引入方法调用,而不会违反合同。

让您真正需要做的是这样的:

[OperationContract] 
MyResponse GetData(); 

[OperationContract] 
MyResponse GetFilteredData(string filter); 

任何其他变化,你认为会)撕毁合同,或b)根本就不在WCF工作:

+0

其实,我同意你的建议去了,但Agent_9191的回答是更正确的关于我原来的问题,所以我接受了他的答案和+ 1'ed你的。 – 2009-11-19 18:38:32

3

你可以试试这个:

[OperationContract] 
MyResponse GetData(); 

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