向WCF ServiceContract添加方法是否会破坏现有客户端?

时间:2009-03-10 19:38:09

标签: c# .net wcf

我们有一个现有的ServiceContract

[ServiceContract(Namespace = "http://somesite.com/ConversationService")]
public interface IConversationService
{
        [OperationContract(IsOneWay = true)]
        void ProcessMessage(Message message);

        [OperationContract(IsOneWay = true)]
        void ProcessMessageResult(MessageResult result);
}

我们需要为它添加一个方法

[ServiceContract(Namespace = "http://somesite.com/ConversationService")]
public interface IConversationService
{
        [OperationContract(IsOneWay = true)]
        void ProcessMessage(Message message);

        [OperationContract(IsOneWay = true)]
        void ProcessMessageResult(MessageResult result);

        [OperationContract(IsOneWay = true)]
        void ProcessBlastMessage(BlastMessage blastMessage);
}

这会破坏使用此服务的任何现有wcf客户端吗?或者我们是否必须更新所有现有的wcf客户端?

编辑:此服务同时使用netTcpBinding和netMsmqBinding

5 个答案:

答案 0 :(得分:8)

我认为您现有的客户将继续工作。毕竟,这与SOAP和Web服务非常相似,因为客户端将连接到给定的URL并请求特定的服务。如果你采取方法,你将有破损的风险(只有使用我相信的方法),但添加应该没有痛苦。

我只涉足WCF,但以这种方式使用ASP.NET Web服务取得了巨大成功。

答案 1 :(得分:4)

不,我不希望这样 - 添加 NOT 改变任何现有方法/函数调用的新功能/新服务方法不会影响“旧”客户端。当然,在从元数据重新创建代理或手动修改代理之前,他们不会了解新方法。

但现有的通话应该不受影响,只要他们的签名(他们交换的数据)保持不变。

马克

答案 2 :(得分:1)

通常,添加到SOA解决方案中的消息不会破坏合同。我相信只要你没有使用二进制协议(net.tcp),你就会保持向后兼容性。

我不确定它是否会破坏使用二进制绑定的客户端?

答案 3 :(得分:1)

我对此采取了更为极端的观点。为什么要改变什么?相反,为什么不创建一个新的合同,从旧的继承,并添加新的操作?新合同可以在同一服务的单独端点中公开。

可能是偏执狂不通过正式证据,但在我看来,如果可以构建一个可以区分差异的客户,那么当你做出改变时,某些客户可能会“破坏”。请注意,当您更改服务合同时,您不仅仅是更改服务代码 - 您正在更改任何恰好更新其服务引用的客户端中的代理代码。一些更保守的客户可能会认为这是重新测试客户端代码的一个原因 - 毕竟,他们可能会有规则说他们必须在对代码进行任何更改时重新测试代码。

现有客户端将引用原始端点,因此不会受到添加新端点的影响 - 如果执行“更新服务引用”,则不会更改代码。

此外,为什么即使认为,如果你不需要?

答案 4 :(得分:1)

我刚刚使用WCF客户端Windows应用程序(UWP)对其进行了测试,并在更新WCF服务应用程序后继续工作。所以:如前所述,添加方法时客户端不会中断。

我认为值得一提的是,使用Visual Studio 2015更新服务客户端是多么容易:

  1. 确保您的WFC服务正在运行。

  2. 只需转到Solution Explorer

  3. 展开Service References

  4. 右键点击服务参考

  5. 点击Update Service Reference

  6. 如果收到错误消息,请重复上一步。我出于某种原因不得不尝试几次。