如何更改不影响客户端的WCF服务合同?

我是新手,但在阅读一些关于wcf的文章后我才知道,如果你改变了ServcieContrcat,那么你不仅要改变服务端,而且还要改变客户端,这真的很难管理。

Example 1: 

开发人员必须为订单处理创建WCF服务,具有以下function:GetOrderById,GetOrdersByStatus,SaveOrder

ServiceContract可能如下所示

 [ServiceContract] public interface IOrderService { [OperationContract] Order GetOrderById(int orderId); [OperationContract] List GetOrdersByStatus(OrderStatus orderStatus); [OperationContract] void SaveOrder(Order order) } 

例如,月之后,项目经理说:好的,我们的客户需要另外的function:DeleteOrderById,GetOrdersByCustomerId并且不再需要GetOrdersByStatus,我们需要GetOrdersByStatusAndCustomerId

开发人员必须更新ServiceContrcat并更新客户端。 如您所见,ServiceContrcat中的任何更改都非常困难

所以我正在寻找最好的指导如何开发wcf服务,如果我们扩展function或任何类型的更改不会产生任何问题,但客户端不会遇到任何问题。 谢谢

在此处输入图像描述 我遇到了同样的问题,基本上是对方法的永久更改,会破坏客户端上的接口。

这就是我所做的:我所有的30多个函数(以及列表增长和增长)都将字符串,整数和字节()作为数据类型作为输入和输出参数,我创建了一个主单端点和接收的函数,如一个输入参数,并作为输出发回一个简单的类。 这个名为HostInterface的类只包含两个参数,一个字符串(我用来封装我的所有字符串和整数)和一个byte()数组(我填充所有的二进制文件)

因此,无论客户端是仅使用一个字符串参数调用像Ping()这样简单的东西,还是像5个字符串,2个整数和一个字节数组那样复杂的ResumeDownload(),所有这些参数都封装在我的HostInterface类中,字符串并将一个String参数(作为XML)和字节转换为字节字段。

在主机端收到请求时:

  Function HostConnect(byval objInbound as HostInterface) as HostInterface 

我在objInbound中解压缩字符串参数,将XML更改为对象,然后解压缩字节并将它们添加到同一对象的字节部分。 然后我检查方法名称(ping或ResumeDownload)并相应地处理。 下图显示了基本思想 – 所有函数通过单个函数操作,该函数接收和发送相同的简单classe作为参数。 因此,我的界面永远不需要改变。