【问题标题】:SignalR in multiple instances in AzureAzure 中多个实例中的 SignalR
【发布时间】:2014-08-13 14:10:56
【问题描述】:

我想使用 Azure 来托管我的 Web 应用程序,例如 CloudService Web 角色或 Azure 网站,在我使用 SignalR 连接客户端和服务器的应用程序内。

由于我为我的 Web 角色扩展了两个实例,我似乎遇到了一个非常常见的问题,SignalR 找不到正确的原始实例。客户端 JavaScript 说已经启动了,但是 server hub OnConnected event 随机没有引发,所以本来打算被客户端调用的 server 方法也没有引发,所有这些奇怪的问题都是随机发生的。

一旦我将实例更改为一个,所有问题都消失了。那么谁能解释一下客户端调用服务器方法时发生了什么,为什么有时服务器似乎没有正确响应?

我找到了post,Azure Service Bus 可以解决这个问题吗?

【问题讨论】:

    标签: asp.net azure signalr azureservicebus


    【解决方案1】:

    是的,您需要使用 azure 服务总线。否则,连接将存储在给定服务器的内存中,而另一台服务器对它们一无所知。创建服务总线后,只需在启动类中引用它即可。

    public void Configuration(IAppBuilder app)
    {
        System.Diagnostics.Trace.TraceInformation("SignalR Startup > Configurtion start");
        // Any connection or hub wire up and configuration should go here
        string connectionString = "XXX";
        GlobalHost.DependencyResolver.UseServiceBus(connectionString, "TopicName");
    
        ...
    }
    

    您还需要在每个中心方法中获取对上下文的引用:

      var context = GlobalHost.ConnectionManager.GetHubContext<HubName>();
    

    这很容易:)

    【讨论】:

    • 谢谢,我仍然对一件事感到困惑:连接仅存在于原始实例中还是作为客户端调用的实例响应而创建的新连接?
    • 连接是从客户端生成的...生成一个客户端 ID,并且该客户端 ID 用于通信,直到用户更改页面(在 JavaScript 客户端的情况下)。该 id 将用于发送到该客户端的所有消息。如果用户更改页面,则会生成一个新的客户端 ID。
    • 因此假设连接存储在实例A(不使用ServiceBus),然后客户端调用服务器方法,实例B代替,实例B会创建新的集线器实例来响应请求还是简单地它根本无法响应?
    • 它应该能够正常响应,尽管它可能具有不同的连接 ID(它们是在服务器上生成的)。 SignalR 是无状态的,不涉及任何会话。问题是除非您使用背板,否则用户的集合是分开的。例如,如果您说要从服务器 A 向所有用户广播消息,则在服务器 A 上跟踪的所有用户都会收到该消息,但服务器 B 不会收到该消息。如果您尝试向特定用户 ID 发送消息,而他们恰好在 diff服务器,他们不会收到它。您必须使用背板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多