C# 使用两个WCF服务而不是一个带有回调的WCF服务的缺点是什么?

C# 使用两个WCF服务而不是一个带有回调的WCF服务的缺点是什么?,c#,wcf,C#,Wcf,我使用WCF服务(NetTcpBinding)实现了一个客户机/服务器设置。这种设置使得客户端基本上向服务器发送一些命令和指令(大部分是单向调用)。但是,服务器可能需要非常快速地将大量数据发送回客户端。我已经在主WCF服务上使用回调实现了这一点(服务器非常频繁地进行这些回调) 但是我花了很长时间让它正常工作。这似乎主要归结为异常/挂起(主要是挂起),当服务器正在将大量数据发送回客户端时,客户端调用服务器时会发生这些异常/挂起。我已经尝试了我所看到的一切,例如将我的大多数调用设置为[Operati

我使用WCF服务(
NetTcpBinding
)实现了一个客户机/服务器设置。这种设置使得客户端基本上向服务器发送一些命令和指令(大部分是单向调用)。但是,服务器可能需要非常快速地将大量数据发送回客户端。我已经在主WCF服务上使用回调实现了这一点(服务器非常频繁地进行这些回调)

但是我花了很长时间让它正常工作。这似乎主要归结为异常/挂起(主要是挂起),当服务器正在将大量数据发送回客户端时,客户端调用服务器时会发生这些异常/挂起。我已经尝试了我所看到的一切,例如将我的大多数调用设置为
[OperationContract(IsOneWay=true)]
,并在
服务行为上设置
ConcurrencyMode=ConcurrencyMode.Multiple
。这减少了挂起的数量,但没有阻止挂起

因此,由于对我来说最重要的是快速获得一个有效的解决方案(截止日期即将到来),所以我正在考虑重构以拥有两个WCF服务。第一种方法与现在使用命令进行的所有客户机-服务器调用一样。第二个方向相反,将在客户端连接到服务器后设置。此服务将用于将数据发送回客户端


这种方法有什么缺点吗?WCF服务双向运行有什么问题吗?还有其他窍门吗?还是说我完全偏离了这一点?

这对我来说不是个坏主意。第一个服务可以向第二个服务用于按顺序处理的队列中添加命令或任何内容


您甚至可以将第二个服务回调到第一个服务,然后第一个服务将回调到客户端。这样,客户只需与一个服务交谈,而该服务除了接受请求和吐回结果之外,实际上没有什么作用。第二个服务可以在自己的时间内完成它的工作

对我来说,这听起来不是个坏主意。第一个服务可以向第二个服务用于按顺序处理的队列中添加命令或任何内容


您甚至可以将第二个服务回调到第一个服务,然后第一个服务将回调到客户端。这样,客户只需与一个服务交谈,而该服务除了接受请求和吐回结果之外,实际上没有什么作用。第二个服务可以在自己的时间内完成它的工作

这是一个有点棘手的情况,我认为按照您概述的方式进行操作并不可怕,尽管可能存在一些维护缺陷

服务器需要知道客户端的地址才能调用其WCF服务。起初这可能不是问题,但如果您添加客户机或升级客户机,您可能会遇到一些挑战

如果客户负责打所有的电话,那么当您向外扩展时,维护就更容易了

从你上面的评论来看,如果你所追求的是近实时监控,那么我对WCF的使用表示怀疑。设置可能需要更多的时间(因为不是在这个截止日期),但从长远来看,您可能会有更好的运气使用专门为此而设计的系统

我可能会使用一种多播队列解决方案,在这种解决方案中,您有一台服务器,但有多个侦听器,然后您的服务器不断推送队列中的项目(可能是文本行),客户端读取它。类似于AMQP(比如rabbitmq)、MSMQ(没有使用它,但它是由微软提供的)、zeromq等


或者,即使是简单的套接字通信也会给您带来更高的性能,而且您不会有一个框架来计时(看看zeromq,它的工作原理几乎与套接字类似)。这样,客户端可以在不需要时连接、接收更新和断开连接。

这是一个有点棘手的情况,我认为按照您概述的方式进行连接并不可怕,尽管可能存在一些维护缺陷

服务器需要知道客户端的地址才能调用其WCF服务。起初这可能不是问题,但如果您添加客户机或升级客户机,您可能会遇到一些挑战

如果客户负责打所有的电话,那么当您向外扩展时,维护就更容易了

从你上面的评论来看,如果你所追求的是近实时监控,那么我对WCF的使用表示怀疑。设置可能需要更多的时间(因为不是在这个截止日期),但从长远来看,您可能会有更好的运气使用专门为此而设计的系统

我可能会使用一种多播队列解决方案,在这种解决方案中,您有一台服务器,但有多个侦听器,然后您的服务器不断推送队列中的项目(可能是文本行),客户端读取它。类似于AMQP(比如rabbitmq)、MSMQ(没有使用它,但它是由微软提供的)、zeromq等


或者,即使是简单的套接字通信也会给您带来更高的性能,而且您不会有一个框架来计时(看看zeromq,它的工作原理几乎与套接字类似)。这样,客户端可以连接,并在不需要时接收更新和断开连接。

是否可以将您的响应拆分为多个页面,然后客户端会发出后续检索请求?我不知道通过单个服务调用发送大量数据是否是个好主意。@Kekoa-不太可能。。。那真的不符合要求。服务的重点是以近似实时的方式监控数据馈送。我可以在某种程度上“分块”数据。。。或者我想我可以让客户机每隔一段时间请求数据(“GetLastData”类调用)。Hrm…是否有可能将您的响应分成几个页面,然后客户机会发出后续检索请求?我不知道通过单个服务调用发送大量数据是否是个好主意。@Ke