Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web服务版本控制-向WCF中的服务契约添加操作_C#_.net_Wcf - Fatal编程技术网

C# Web服务版本控制-向WCF中的服务契约添加操作

C# Web服务版本控制-向WCF中的服务契约添加操作,c#,.net,wcf,C#,.net,Wcf,在WCF服务中,如果在客户端(使用该服务的客户端)完成其实现后将方法添加为操作契约,会发生什么情况?即使现有客户机不使用新的操作契约方法,它们也必须修改它们的实现吗 编辑:即使客户不使用新合同,他们也必须更新他们的代理吗 否,服务中的新操作合同不会破坏客户端接口。只要客户端所依赖的方法签名保持不变,就可以自由地更改接口。这意味着您可以添加任意数量的新接口成员。答案取决于您的观点。我说更改合同根本就是违反合同。这就是为什么他们称之为“合同” 通过添加其他操作来更改服务契约会“破坏”客户机,因为它将

在WCF服务中,如果在客户端(使用该服务的客户端)完成其实现后将方法添加为操作契约,会发生什么情况?即使现有客户机不使用新的操作契约方法,它们也必须修改它们的实现吗


编辑:即使客户不使用新合同,他们也必须更新他们的代理吗

否,服务中的新操作合同不会破坏客户端接口。只要客户端所依赖的方法签名保持不变,就可以自由地更改接口。这意味着您可以添加任意数量的新接口成员。

答案取决于您的观点。我说更改合同根本就是违反合同。这就是为什么他们称之为“合同”

通过添加其他操作来更改服务契约会“破坏”客户机,因为它将更改其代理代码。在许多企业环境中,即使现有客户机代码没有调用新操作,这样的更改也需要通过QA。基本上,通过添加操作,您可以编辑客户机代码。从这个意义上讲,显然需要QA

当您可以创建一个新的服务契约,并让另一个服务端点实现它时,无需修改服务契约。您甚至可以让新服务同时实现旧合同和新合同,并共享完全相同的代码来实现旧合同


我也是一个老式的人,他们认为应该为不同的合同使用不同的名称空间。至少在挑剔的意义上,旧合同和新合同是不同的,因此可能相同的名称在两者之间意味着不同的东西。这可以通过让新契约从旧契约派生来缓解,这样旧名称将保留在旧名称空间中,而新名称将保留在新名称空间中。

如果您关心版本控制,我的建议是遵循契约优先的方法:WSDL应该是要进行版本控制的方法,因为当客户想要使用您的服务时,您向他们公开的是WSDL。让WCF(或任何其他web服务技术)在没有您直接控制的情况下更改WSDL,迟早会给您(或您的客户机)带来痛苦


请参阅和一些关于工作流的建议。

我刚刚针对类似情况实施了一个解决方案。最初,我只是创建了一个扩展当前ServiceContract的新接口,使用服务契约继承,更新端点定义以交付新的派生接口(如建议的)

对于正在连接的其他.net应用程序来说,这是很好的,那些寻找“旧”接口的应用程序得到了它,而那些寻找“新”接口的应用程序得到了它

问题是我有一个非.net应用程序,它正在寻找一个明确的硬编码绑定,
BasicHttpBinding\u IOriginalInterface
,但新服务提供了
BasicHttpBinding\u IDerivedInterface


通过将两个接口统一到一个通用的ServiceContractName
[ServiceContract(Name=“IOriginalInterface”)]
,这就解决了这个问题,正如所建议的那样

如果我要创建另一个服务合同来保存新方法,我就不能提供一个统一的接口来将相关方法聚合在一起。@John Saunders:我同意你的观点,但从实用的角度来看,我相信你可以看到将新方法放入合同并将其视为一个新版本的好处,这是倒退的兼容的。话虽如此,我同意你说的每一句话。@Nick:一个服务可以实现多个服务合同。还有,如果他们碰巧更新了他们的代理,只是为了给你制造麻烦呢?@Igor:这不是WCF的问题,因为服务契约、操作、数据、故障和消息契约在WSDL中几乎是一对一的。这与ASMX服务不同,后者试图解释您的意思,然后从中创建WSDL。@约翰:是的,但仍然-WSDL是客户端和服务器之间的有效契约,而不是C#/Java/。。。客户端/服务器代码,因此应以“尊重”对待。不,如果基本操作保持不变(包括所有参数),则现有客户端不需要更新其引用。