2011-11-30 57 views
1

我有一个使用WCF服务(NetTcpBinding)实现的客户端/服务器设置。设置是这样的,客户端基本上向服务器发送一些命令和指令(主要是单向呼叫)。但是,服务器可能处于需要非常迅速地将大量数据发送回客户端的情况。我已经实现了目前在主WCF服务上使用回调(服务器非常频繁地进行回调)。下面使用两个WCF服务而不是一个回调?

但我有一段时间让它正常工作。它大多数似乎归结为客户端在服务器正在向客户端发送大量数据的过程中调用服务器时发生的异常/挂起(大部分挂起)。我已经尝试了几乎所有的事情,比如将我的大部分电话设置为[OperationContract(IsOneWay=true)],并将ConcurrencyMode=ConcurrencyMode.Multiple设置为ServiceBehavior。这减少了挂起的次数,但没有阻止它们。

所以,因为对我来说,迅速得到一个可行的解决方案是最重要的(最后期限将至),我考虑重构有两个WCF服务。第一个就像所有客户端服务器现在使用这些命令一样。第二个方向相反,并且在客户端连接到服务器之后进行设置。该服务将用于将数据发送回客户端。

这种方法有什么缺点吗? WCF服务在两个方向都有问题吗?任何其他提示或技巧?或者我完全不在这个基地?

+0

是否有可能将您的响应分解为多个页面,然后客户端将使后续请求检索?我不知道通过一次服务呼叫发送大量数据是一个好主意。 – Kekoa

+0

@Kekoa - 不是真的......这不符合要求。该服务的重点是以近似实时的方式监控数据馈送。我可以在某种程度上“分块”数据......或者我想我可以让客户端以某个间隔(“GetLastData”类型的呼叫)请求数据。人力资源管理... – Tim

回答

1

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

你甚至可以有第二个服务调用回第一服务,则这将回调到客户端。这样,客户只需与一个服务进行交谈,除了接受请求并回吐结果之外,其他服务实际上并没有多大作用。第二项服务可以在自己的时间内完成。

0

这是一个有点棘手的情况,我不认为这是可怕的做到这一点,你所概述的方式,虽然可能有一些维护的缺点。

服务器需要知道客户端的地址来调用他们的WCF服务。一开始这可能不是问题,但如果您添加客户端或升级客户端,那么您可能会遇到一些挑战。

如果客户有责任使所有的呼叫,然后,让当你向外扩展更容易维护。

变成为关你上面的评论,如果你以后有什么是近实时监控,敢问使用WCF的在所有的这一点。可能需要更多时间才能建立(因为不是在这个截止日期),但是从长远来看,为系统量身定制的系统可能会更好。

我可能会用一个多播排队的解决方案,那就是你有一台服务器,但多个听众去,那么你的服务器保持在队列中推动项目(可能的文本行)和客户端阅读。像AMQP(如rabbitmq),MSMQ(没有使用它,但它是由微软),zeromq等。像

甚至简单的套接字通信会给你更多的性能,你不会有一个框架计时(看看zeromq,它几乎像一个套接字一样工作)。这样客户端就可以连接,并在不再需要时接收更新并断开连接。