Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向WCF ServiceContract添加方法是否会破坏现有客户端?_C#_.net_Wcf - Fatal编程技术网

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

C# 向WCF ServiceContract添加方法是否会破坏现有客户端?,c#,.net,wcf,C#,.net,Wcf,我们有一份现有的服务合同 [ServiceContract(Namespace = "http://somesite.com/ConversationService")] public interface IConversationService { [OperationContract(IsOneWay = true)] void ProcessMessage(Message message); [OperationContract(IsOne

我们有一份现有的服务合同

[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客户端


编辑:此服务同时使用NetCpBinding和netMsmqBinding,我认为您现有的客户端将继续工作。毕竟,这与SOAP和web服务非常相似,因为客户端将连接到给定的URL并请求特定的服务。如果你拿走了这些方法,你将面临破碎的风险(我相信只有在使用了这种方法的情况下),但是添加这些方法应该是无痛的

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

一般来说,在SOA解决方案中添加一条信息并不会破坏合同。我相信,只要不使用二进制协议(net.tcp),就可以保持向后兼容性


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

不,我不认为-添加不改变任何现有方法/函数调用的新功能/新服务方法不会影响“旧”客户机。当然,在从元数据重新创建代理或手动调整代理之前,他们不会知道这些新方法

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


马克

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

这可能是一种没有正式证据的妄想症,但在我看来,如果有可能构建一个能够分辨差异的客户机,那么当你做出改变时,一些客户可能会“崩溃”。考虑一下,当您更改服务合同时,您不只是更改服务代码——您正在更改任何更新服务引用的客户端中的代理代码。一些更保守的客户可能会考虑重新测试客户机代码的原因,毕竟,他们可能有规则说,当对代码进行任何更改时,都必须重新测试代码。 现有客户端将引用原始端点,因此不会受到添加新端点的影响-如果执行“更新服务引用”,则代码不会更改


此外,如果你不必考虑的话,为什么还要考虑呢?

我刚刚用一个WCF客户端Windows应用程序(UWP)测试了这一点,它在更新WCF服务应用程序后继续工作。所以:如前所述,当您添加方法时,您的客户机不会中断

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

  • 确保您的WFC服务正在运行

  • 只需转到
    解决方案资源管理器

  • 展开
    服务参考

  • 右键单击您的服务引用

  • 单击
    更新服务参考

  • 如果收到错误消息,请重复最后一步。出于某种原因,我不得不试了几次


  • 是的,这是我担心的事情之一。我们有netMsmqBinding和netTcpBinding。您应该编辑该问题以反映您关心的是net.tcp和net.msmq协议绑定。从旧的继承不会导致创建新的服务配置节点和.svc文件中的新条目吗?我认为(name-value)必须是契约的实现类的Namespace.ClassName,在本例中,它将是派生类而不是基类。因此,将派生合同放在同一服务中似乎不起作用。如果我错了,你能举个例子吗?我的错误是:在服务“Namespace.BaseClass”实现的契约列表中找不到契约名称“Namespace.IDerivedInterface”@lazarus,我同意你的看法,只是我在修改WCF服务方面的每一次经验都会导致破坏(添加新的操作契约,添加可选参数)。ASP.NET web服务的行为完全不同,而且限制似乎更少。@andrew hare[需要引用]