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


我们有一个现有的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


5723
2018-03-10 19:38


起源

您应该编辑问题以反映您关注net.tcp和net.msmq协议绑定。 - Michael Meadows


答案:


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

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


8
2018-03-10 19:49



+1这是正确的。 - Andrew Hare
@lazarus,我同意你的意见,除了我修改WCF服务所带来的每一次经历都会导致破坏(添加新的操作合同,添加可选参数)。 ASP.NET Web服务的行为完全不同,似乎限制性较小。 - Andrew Theken
@ andrew-hare [引证需要] - Andrew Theken


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

但是现有的呼叫应该不受影响,只要它们的签名(它们交换的数据)保持不变即可。

渣子


4
2018-03-10 21:24





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

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


1
2018-03-10 19:49



是的,这是我担心的事情之一。我们有netMsmqBinding和netTcpBinding绑定 - Nick


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

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

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

此外,为什么甚至 认为 关于它,如果你不需要?


1
2018-03-11 09:56



不会从旧的继承导致创建新的服务配置节点和.svc文件中的新条目?我认为<service name =“”>(名称值)必须是合同实现类的Namespace.ClassName,在这种情况下,它将是派生类而不是基类。因此,似乎将派生合同放在同一服务中是行不通的。如果我错了,你能提供一个例子吗?我的错误是:在服务'Namespace.BaseClass'实现的合同列表中找不到合同名称'Namespace.IDerivedInterface' - EbbnFlow


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

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

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

  2. 简单地去吧 Solution Explorer

  3. 扩大 Service References 

  4. 右键单击您的服务引用

  5. 点击 Update Service Reference

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


0
2017-11-17 22:39