在您的网站多signalR连接/集线器(Multiple signalR connections/h

2019-06-26 16:51发布

如果我有一个可以使用多个集线器类多页,什么是管理最好的方法?

例如:

  • 它是坏的导航到另一个页面的网站,基本上是“重新打开”到同一个集线器类是以前的页面上打开的连接?

  • 我在想,一个页面上打开多个集线器连接,是可以的,因为它们是在一个连接的所有统一纠正,即使它们是不同的轮毂类?

Answer 1:

你可以有多个集线器共享网站上的一个连接。 SignalR 2.0更新了,没有在性能上少了一个signlar连接来处理多个集线器。

官方文档: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#multiplehubs

所有客户端都将使用相同的URL(如果指定了一个“/ signalr”或您的自定义URL)以建立与服务SignalR连接,并连接用于由服务定义的所有集线器。

多个集线器没有性能上的差异相比,在一个类中定义的所有集线器功能



Answer 2:

要开始使用集线器进行阅读的集线器WIKI进入和枢纽进行客户端 。 有根据多个页面的情况下几件事情。

  1. 当您启动集线器它给你的客户端,它保持不变为枢纽 (有人能确认例如)在多个页面的ID。
  2. 它不坏重新到同一集线器的连接。 您可能对所有页面运行hub.start客户端的方法,但是如果它的一个客户端打开多个窗口或从一个网页到另一个你将不得不对集线器相同的连接ID,因此您可以保持联系。 如果是多个集线器,那么你必须要管理枢纽以及连接ID。 所以,这个问题就像是“这样做不好有服务于不同的网站,我的互联网连接多个ISP”。 你可以请他们却是矫枉过正。 一个单一的ISP可以服务器的所有网页,以你为好。
  3. 在单页上多个集线器是不理想,但它会奏效。 同样的答案需要一些背景的问题,但一般而言,您可以通过群组或使用其他参数为基础的方法对相同的连接ID的各种要求之间进行区分。 有同一页面上两个轮毂可能需要更多的资源 (需要测试这个)比使用参数或组独立的信息的不同区域。

例:

你有一个页面,有两个部分,这显示实时用户活动和一个区域来查看用户做一个表的实时数据变化的曲线图。 您将创建两个集线器或两组还是什么? 存在使用相同的图形和数据表的其他页面。

我的解决方案:

  1. 我将创建一个单一的枢纽应用程序从服务器收到的实时数据。
  2. 我将建立一个关于服务器不同的方法来发送图点和数据表。
  3. 我将使用这些图形与同一中心服务器的方法进行通信的所有页面创建客户端的方法。

当你的页面之间切换客户端将与相同的轮毂和要求getGraph或getDataTable或两者连接,并与相关的数据填充其客户。 同样在服务器数据改变时,你可以调用客户端的方法来更新所有客户端或他们的组 (让我们添加了这种复杂性)

假设你有学生和老师在看你的应用程序。 它们需要不同级别的数据访问。 您可以使用组来让他们分开在轮毂上,这样你就不会送教师对学生和学生数据,以教师信息。

  1. 在集线器连接,您可以添加他们加入与他们的角色或任何差分功能相关的一组。
  2. 当您发送给所有的客户,现在可以发送给客户的群体是教师还是学生。 不创造教师还是学生的另一个中心,他们都在同一个集线器。

回到你的问题,“这样做不好”和“是确定”这是很难确定没有实际应用的上下文。 我不能想象这样一个场景,你可以开证明多个中心的性能 。



Answer 3:

SignalR核心 - 不可能

不幸的是这不再是不可能在新的“核心”版本SignalR的

https://github.com/aspnet/SignalR/issues/456

https://github.com/aspnet/SignalR/issues/955


注:问题与iOS和自签名证书

在iOS上有每台服务器的四个连接的限制。

现在没有这个限制的WebSockets(我认为这可能是32,但不知道)。 但是我使用的是自签名证书,有各种各样的问题,在Safari中-因此它实际上下降到长轮询(并且不是很明显它这样做)。

所以我结束了这些连接:

  • 1 - 角/热的WebPack重载插座
  • 2 - 网页API调用
  • 3 - 集线器头号
  • 4 - 枢纽二号
  • 5 - #&#&#$&#$&

所以,如果我只有三个枢纽整个Safari浏览器页面会锁定一个蓝条。 即使网络API调用得到阻止。

注意:使用HTTP / 2 这个限制没有了 ,但你可能会更好过,特别是如果你使用热重载自己局限于一个枢纽 。 加上发展建立HTTP / 2未必是简单的任务。


因此,如何解决?

首先(临时)设置你的集线器只能接受WebSockets的。 这会给你在Safari中的错误(使被抓住并警告对话框中显示一定的误差)。

routes.MapHub<SignalRHub>("/rt", options =>
{
     // when run in debug mode only WebSockets are allowed
     if (Debugger.IsAttached) {
        options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets;
     }
});

现在,你就可以确认修复 - 在调试模式下运行,或删除的“如果”。

与iOS的问题是,即使你接受HTTPS流量自签名证书 - 并在浏览器中得到一个可爱的小“锁”符号 - 它并不适用于WSS:协议。 所以连接不能升级到WSS,这就是为什么他们在4 MAX块。

解决方案#1

如果你能得到的一切到一个集线器,它只是更容易:-)

我还意识到,多个集线器复杂重新连接逻辑如果连接丢失。 一个集线器只是让这更容易。 如果你不小心,你最终会显示3个对话框说“失去的连接。 重试?' 我切换到一个单一的枢纽正因为如此。

虽然我讨厌一切混合,部分类帮助,我个人没有太多SignalR方法反正。

解决方案#2

这只是为了调试相关的,并假定您使用的是HTTPS证书,你自签名。

改用类似letsencrypt - 或CloudFlare的ARGO隧道得到一个公开可信的证书。 这将通过Safari浏览器可以完全信任,所以你的连接将获得升级到真正的网络套接字。

解决方案#3

创建自签名的根证书(CA),然后生成一个与它的域名的SSL证书。

这比我想象的复杂。 最终事实证明我是缺少Subject Type=CA在我的根证书- iOS系统要求。 如果没有这个“延伸”,它会安装根证书作为配置文件,但不会让你选择它的SSL。

一旦你的根证书安装Safari浏览器将使用WebSockets工作得很好。

解决方案#4

只使用HTTP。 这是不是一种选择,对我来说,因为我使用某些API,如Facebook /谷歌/付款,他们需要HTTPS。

笔记

  • 重要提示:现在考虑生产。 要认识到的WebSockets可能会因各种原因无法使用,所以如果你有一个连接在iOS 4个的枢纽,这仍然可能导致阻塞。 你的生活危险。

最好使用一个集线器摆在首位。 而且最好能得到正确安装证书等等,iOS将使用WebSockets工作。

如何创建和无需用户交互安装在Windows 10 X.509自签名的证书?



文章来源: Multiple signalR connections/hubs on your website