【问题标题】:Sharing connections between two SignalR Hubs on different domains在不同域上的两个 SignalR 集线器之间共享连接
【发布时间】:2019-01-09 23:24:52
【问题描述】:

我目前设置了一个实时聊天网站,该网站访问负责处理 SignalR 交互的子域:

www.domain1.com > chat.domain1.com

我想介绍第二个使用相同结构的、重复的、基本相同的网站:

www.domain2.com > chat.domain2.com

两个站点将使用相同的数据库,该数据库存储所有与 SignalR 相关的持久性内容,例如连接、聊天室、聊天消息等。

两个 SignalR 聊天子域是否可以与连接到另一个子域的客户端进行通信?虽然共享数据库意味着共享持久资源,但我需要这样做,以便当我在 chat.domain1.com 上发布事件时,客户端连接到两个 chat.domain1.com em> 和 chat.domain2.com 接收它们。

似乎通常通过共享同一个域并使用 CORS 来处理跨域交互来处理这个问题,如下所示:

www.domain1.com  
                > chat.domain1.com
www.domain2.com

我不能这样做,因为 SignalR 聊天端点使用在主 www 域上设置的 cookie 进行身份验证。这些 cookie 不能跨域共享,即使可以,也要求用户能够在同一台机器上同时登录 domain1.com 和 domain2.com 上的不同帐户。

那么,有什么方法可以用来在这两个集线器之间共享连接吗?两个聊天子域都托管在同一台服务器上?

【问题讨论】:

    标签: asp.net-mvc signalr cross-domain signalr-2 .net-4.7.2


    【解决方案1】:

    当您的应用在多个服务器上横向扩展时,通常会使用背板,但它似乎也可以在这种情况下工作。我使用 SQL Server 作为背板,但也有一些包可以与 Redis 和 Azure 服务总线一起使用。


    首先安装 SQL Server 的包:

    Install-Package Microsoft.AspNet.SignalR.SqlServer
    

    然后配置背板:

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            string sqlConnectionString = "Connecton string to your SQL DB";
            GlobalHost.DependencyResolver.UseSqlServer(sqlConnectionString);
            app.MapSignalR();
        }
    }
    

    这允许 SignalR 使用 SQL Server 来持久化它需要分发的任何消息。第一次启动时,它会在数据库中创建一些表,然后您就可以开始了:

    因为两个应用程序共享同一个数据库,所以效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2010-12-07
      • 1970-01-01
      相关资源
      最近更新 更多