我正在使用双工netTcpBinding
的WCF,我想向当前连接到我服务的所有用户发送消息。我以为我可以创建一个回调合约,它会向所有客户发送一条消息,但似乎我错了,没有一个服务器/服务,每个客户都有自己的服务?
我的服务名称为'Server'。以下是我从客户端访问服务器的方法 -
ServerClient client = new ServerClient();
string result = client.SendMessage(messageTextBox.Text);
client.Close();
我认为'Server'是一个处理我的客户端所有调用的单个对象,但后来我在Server构造函数中启动了一个线程,我发现多个线程都启动了,因为每次客户端调用Server时,创建一个新的Server对象。
所以似乎每个客户端都拥有自己的服务/服务器。
答案 0 :(得分:3)
1)如果您希望所有客户共享同一台服务器,您需要将服务设为单身。将此属性添加到实现服务的类(而不是接口):
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
那就是说,我怀疑你真正想要的是List<ServerClient>
的同步,静态(线程共享)实例。然后,您将迭代它以向每个客户端发送消息。使用该设计,您不需要单一服务器(只需在列表周围提供一些良好的线程安全性)。
2)如果客户端关闭其服务器代理,服务器将无法向其发送任何消息。您需要保持代理打开并将其存储在客户端的某个位置。这种设计当然会显着限制可扩展性。
答案 1 :(得分:1)
默认情况下,每个客户端都将获得自己的服务实例。但是,您可以将服务设为单件(这将处理来自所有客户端的请求)。
您可能还想浏览此Instance management article