我对我的应用程序有以下要求:在JavaScript(客户端)和服务器(ASP.NET)之间打开连接。此连接必须能够将数据发回&在中等时间内保持有状态(与REST调用不同)直到它关闭。也就是说,在连接期间,客户端基本上与服务器具有亲缘关系(在Web场方案中)。
我已经阅读了很多关于SignalR和WebSockets的内容,但我无法弄清楚这是不是它的运作方式。
我不关心web-farm中服务器之间的服务器与服务器通信,因为这已经通过代码解决了。我只需要JS客户端和它最初联系的服务器在连接期间保持联系。
这是如何工作的,如果没有,这可能吗?此外,如果可能,如何在多个呼叫/广播的连接期间将信息存储在内存中?
答案 0 :(得分:7)
请记住,尽管SignalR为您提供了许多透明的东西,但4种底层传输却完全不同。
只有WebSockets和SSE是持久连接。 ForeverFrame和LongPolling是重复的HTTP请求,因此如果您有多个服务器以循环方式进行负载平衡,则无法控制每次调用的位置。
解决方案是使用具有粘性会话的负载均衡器。这种负载均衡器将在HTTP请求中查找特定的cookie,以便为特定服务器设置关联。
其他解决方案是使用SignalR背板,因此您不介意请求的位置,背板可确保连接获得正确的消息:
http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-in-signalr
每个服务器实例通过总线连接到背板。当一个 消息被发送,它进入背板,背板发送它 到每个服务器。当服务器从背板获取消息时,它 将消息放入其本地缓存中。然后服务器传递消息 从本地缓存到客户端。
对于每个客户端连接,客户端的阅读进度 使用游标跟踪消息流。 (光标代表一个 在消息流中的位置。)如果客户端断开然后 重新连接,它要求总线提供之后到达的任何消息 客户端的游标值。连接使用时会发生同样的事情 长期民意调查。在长轮询请求完成后,客户端将打开一个 新连接并询问光标后到达的消息。