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

C# 如何更改不影响客户的WCF服务合同?,c#,wcf,web-services,C#,Wcf,Web Services,我是新来的,但读了一些关于wcf的文章后我才知道,如果你改变了ServcieContrcat,那么你不仅要改变服务端,还要改变客户端,这真的很难管理 Example 1: 开发人员必须为订单处理创建WCF服务,并具有以下功能:GetOrderById、GetOrdersByStatus、SaveOrder ServiceContract可能如下所示 [ServiceContract] public interface IOrderService { [OperationContract

我是新来的,但读了一些关于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)
} 
[服务合同]
公共接口服务
{
[经营合同]
订单GetOrderById(int-orderId);
[经营合同]
列出GetOrdersByStatus(OrderStatus OrderStatus);
[经营合同]
作废保存订单(订单)
} 
例如,一个月后,项目经理说:好的,我们的客户需要另一个功能:DeleteOrderById、GetOrdersByCustomerId,不再需要GetOrdersByStatus,我们需要GetOrdersByStatus和CustomerId

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


因此,我正在寻找最佳的指导,如何开发wcf服务,这将不会产生任何问题,如果我们扩展的功能或任何类型的变化,但客户端将不会面临任何问题。感谢

我也遇到了同样的问题,基本上是对方法的一系列永久性更改,这些更改会破坏客户端上的接口

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

因此,无论客户机是使用一个字符串参数调用简单的Ping()函数,还是使用5个字符串、2个整数和一个字节数组调用复杂的ResumeDownload(),所有这些参数都被封装在我的HostInterface类中,字符串和整数被封装到一个字符串参数中(作为XML),字节被封装到字节字段中

当主机端接收到请求时:

  Function HostConnect(byval objInbound as HostInterface) as HostInterface

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

您应该将WCF合同位提取到两个项目都依赖的库中,然后只需更新一次。您是否可以像您所说的那样举一个示例,这样对我来说事情应该更清楚。感谢这种问题可以通过wcf路由解决?接口更改不能通过路由解决。创建一个单一、稳定、可处理所有情况的端点接口是我使用的方法。示例代码可能很难,因为有很多代码分布在多个项目和类中,但我可能会想出一些东西。非常感谢您的回答。如果你能用你处理你的情况的方式为我创建一个小的示例代码,那将是非常有用的。只是会有一个合同,其中包含三种方法和用于消费的客户端代码。谢谢:)托马斯,对不起,我希望我能,但我没有时间。但您真正需要的是三件事:1)一个类,它将从web服务函数中获取所有参数并将它们打包成xml。2) 您需要一个接受字符串和字节的基本类(如图中所示)。3) 您需要创建一个端点,该端点将基本类作为其输入参数,并返回与输出参数相同的基本类-在两端使用相同的类使事情变得更简单。祝你好运