WCF双工回调,如何向所有客户端发送消息?

时间:2011-12-19 19:51:52

标签: c# wcf

我正在使用双工netTcpBinding的WCF,我想向当前连接到我服务的所有用户发送消息。我以为我可以创建一个回调合约,它会向所有客户发送一条消息,但似乎我错了,没有一个服务器/服务,每个客户都有自己的服务?

我的服务名称为'Server'。以下是我从客户端访问服务器的方法 -

ServerClient client = new ServerClient();
string result = client.SendMessage(messageTextBox.Text);
client.Close();

我认为'Server'是一个处理我的客户端所有调用的单个对象,但后来我在Server构造函数中启动了一个线程,我发现多个线程都启动了,因为每次客户端调用Server时,创建一个新的Server对象。

所以似乎每个客户端都拥有自己的服务/服务器。

  1. 考虑到这一点,我如何从服务器向所有客户发送消息?
  2. 我认为从客户端访问服务器的标准做法是获取代理对象,调用服务函数,然后关闭代理对象,就像上面的代码一样......但是如果我关闭代理对象那么'这意味着我已经关闭了客户端和服务器之间的连接,现在服务器将无法对客户端进行双工回调?

2 个答案:

答案 0 :(得分:3)

1)如果您希望所有客户共享同一台服务器,您需要将服务设为单身。将此属性添加到实现服务的类(而不是接口):

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

那就是说,我怀疑你真正想要的是List<ServerClient>的同步,静态(线程共享)实例。然后,您将迭代它以向每个客户端发送消息。使用该设计,您不需要单一服务器(只需在列表周围提供一些良好的线程安全性)。

2)如果客户端关闭其服务器代理,服务器将无法向其发送任何消息。您需要保持代理打开并将其存储在客户端的某个位置。这种设计当然会显着限制可扩展性。

答案 1 :(得分:1)

默认情况下,每个客户端都将获得自己的服务实例。但是,您可以将服务设为单件(这将处理来自所有客户端的请求)。

您可能还想浏览此Instance management article