从 Azure 函数调用 SignalR

Invoking SignalR from Azure Function

我正在尝试使用我的 Azure 系统设置 SignalR。设置相当标准

当用户从门户开始耗时操作时,我希望云服务能够通过 SignalR 通知所有连接的浏览器云服务已完成。

我想我可以使用像 SignalR 客户端这样的 Azure Function 来做到这一点,它可以被触发以强制 SignalR 使用 Azure 函数中的代码广播消息,就像这样

    HubConnection hub = new HubConnection(*URL OF PORTAL GOES HERE*);

    var proxy = hub.CreateHubProxy(*NAME OF HUB GOES HERE*);
    await hub.Start();
    await proxy.Invoke("Hello"); // Name of default hub method

ASP.NET MVC 方面,我也在使用 Azure 服务总线队列,这似乎是扩展时的建议。所以,在我的 Startup.cs 中,我有

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            GlobalHost.DependencyResolver.UseServiceBus(@"*SERVICE BUS CONNNECTION STRING GOES HERE*", "blah");
            app.MapSignalR();
        }
    }

注意:为了让它与最新的 SignalR 一起工作,我必须使用 Microsoft.AspNet.SignalR.ServiceBus3 nuget 包,否则在调用 UseServiceBus 时我会遇到异常。

现在,一切似乎都奏效了。我可以从 PostMan 调用 Azure 函数,并且在我的浏览器中确实可以通过信号器调用。

但是,我不确定这样做是否正确。在这种情况下缩放是否有效,或者是否有更好的方法强制信号器广播消息?

感谢

你的想法是正确的。我是 运行 相同的体系结构,只是我使用的是 WebJob 而不是 Azure Functions。几点:

  • 为 SignalR 使用服务总线背板是一个不错的选择。我已经 运行 它有一些相当高的数量,而且它表现很好。我在 Whosebug 上与之交谈过的另一位开发人员走的是 Redis 背板路线,但遇到了很多问题。
  • 您已找到在 Azure 函数中创建代理的正确方法。但是,建立 HubConnection 是一项重量级操作。为了提高性能,请考虑一次创建 HubConnection 和代理,然后再使用。您将需要确保处理 SignalR 失去与集线器的连接、用尽重试然后放弃的情况。如果您正在重用 HubConnection 并且发生这种情况,如果您没有逻辑来尝试重新建立连接,您就会遇到麻烦。