使用SignalR由服务器发起的请求/回复

时间:2015-01-05 11:23:14

标签: c# wcf sockets signalr

我有以下情况:

  • 许多客户端(WinForm / WPF,而不是浏览器)连接到SignalR服务器(Hub或PersistedConnection)
  • 服务器保留已连接客户端的列表
  • 在某些时候,基于某些后台进程,服务器需要来自其中一个客户端的信息

据我所知,SignalR支持从客户端调用的服务器方法返回值,但不支持服务器调用的客户端方法返回值。

为此,我实施了一个简单的机制:

  1. 服务器找到相关客户端(通过连接ID)
  2. 服务器生成唯一的Id(Guid),并使用该Id
  3. 保留TaskCompletionSource
  4. 服务器调用相关客户端,并发送唯一ID
  5. 服务器等待TaskCompletionSource
  6. 客户端检索信息并将其发回(使用常规服务器方法调用)以及唯一ID
  7. 服务器(在不同的线程上)根据唯一的Id找到正确的TaskCompletionSource,并调用SetResult()
  8. TaskCompletionSource上的await完成,Server有结果
  9. 这感觉就像强迫SignalR执行它本不应该做的事情。

    有谁知道SignalR能否更好地实施/支持?

    有没有人对这种情况有更好的建议?

    备注:

    • 我考虑使用套接字/ WebSockets,但它们似乎对我的需求来说非常低级,并且不提供请求 - 响应范例
    • WCF全双工有效,但需要在客户端打开端口,并要求客户端拥有公共IP地址。
    • 我期待在我的最终用户的计算机上安装许多客户端,因此互联网延迟,防火墙,安全性等都是一个考虑因素(这就是为什么我更喜欢使用SignalR,这似乎避免了大多数这些问题)

0 个答案:

没有答案