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

标签 c# wcf

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

我有名为“服务器”的服务。这是我从客户端访问服务器的方式 -

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

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

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

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

最佳答案

1) 如果你想让所有的客户端共享同一个服务器,你需要让你的服务成为单例。将此属性添加到实现您的服务的类(而不是接口(interface)):

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

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

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

关于c# - WCF 双工回调,如何向所有客户端发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8566701/

相关文章:

c# - 将 System.Windows.Forms.Label 转换为自定义类型

.net - 当端点地址不为空时,找不到 WCF javascript 代理

c# - SNIReadSyncOverAsync 和 WaitForSingleObject 阻塞 EF 性能?

c# - System.FormatException : 'Invalid length for a Base-64 char array or string.'

c# - 如何在 ASP .Net 核心中的 Swagger 中添加基本授权 header

c# - JSON 解析问题 - 'S' 是 JSON 中无效的可转义字符

c# - 将连接字符串发送到 ApplicationDBContext

javascript - 将 JSON 发布到 WCF REST 端点

wcf - 在 WCF 中使用 Schema 进行消息验证

wcf - 启用已存在的 MSMQ 队列的 WCF 读取