我有以下情况:
- 许多客户端(WinForm / WPF,而不是浏览器)连接到SignalR服务器(Hub或PersistedConnection)
- 服务器保留已连接客户端的列表
- 在某些时候,基于某些后台进程,服务器需要来自其中一个客户端的信息
据我所知,SignalR支持从客户端调用的服务器方法返回值,但不支持服务器调用的客户端方法返回值。
为此,我实施了一个简单的机制:
- 服务器找到相关客户端(通过连接ID)
- 服务器生成唯一的Id(Guid),并使用该Id
保留TaskCompletionSource
- 服务器调用相关客户端,并发送唯一ID
- 服务器等待TaskCompletionSource
- 客户端检索信息并将其发回(使用常规服务器方法调用)以及唯一ID
- 服务器(在不同的线程上)根据唯一的Id找到正确的TaskCompletionSource,并调用SetResult()
- TaskCompletionSource上的await完成,Server有结果
醇>
这感觉就像强迫SignalR执行它本不应该做的事情。
有谁知道SignalR能否更好地实施/支持?
有没有人对这种情况有更好的建议?
备注:
- 我考虑使用套接字/ WebSockets,但它们似乎对我的需求来说非常低级,并且不提供请求 - 响应范例
- WCF全双工有效,但需要在客户端打开端口,并要求客户端拥有公共IP地址。
- 我期待在我的最终用户的计算机上安装许多客户端,因此互联网延迟,防火墙,安全性等都是一个考虑因素(这就是为什么我更喜欢使用SignalR,这似乎避免了大多数这些问题)