在不同域上的两个SignalR集线器之间共享连接

时间:2019-01-09 23:24:52

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

我目前建立了一个在线聊天网站,该网站访问了一个负责处理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上的不同帐户。

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

1 个答案:

答案 0 :(得分:0)

通常,当您的应用程序在多个服务器上横向扩展时,将使用背板,但是在这种情况下它也可以正常工作。我将SQL Server用于背板,但也有一些软件包可用于Redis和Azure Service Bus。


首先为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保留其需要分发的所有消息。第一次启动时,它将在数据库中创建一些表,您很高兴:

Database created for SignalR backplane

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