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

时间:2014-01-23 11:09:03

标签: c# wcf web-services

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

Example 1:

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

ServiceContract可能如下所示

[ServiceContract]
public interface IOrderService
{
    [OperationContract]
    Order GetOrderById(int orderId);

    [OperationContract]
    List<Order> GetOrdersByStatus(OrderStatus orderStatus);

    [OperationContract]
    void SaveOrder(Order order)
} 
例如,月之后,项目经理说:好的,我们的客户需要另外的功能:DeleteOrderById,GetOrdersByCustomerId,不再需要GetOrdersByStatus,我们需要GetOrdersByStatusAndCustomerId

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

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

1 个答案:

答案 0 :(得分:0)

enter image description here我遇到了同样的问题,基本上是对方法的永久更改,会破坏客户端上的接口。

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

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

在主机端收到请求时:

  Function HostConnect(byval objInbound as HostInterface) as HostInterface

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