从 Azure Function 调用 SignalR

Ish*_*hyc 4 asp.net-mvc azure signalr azure-functions

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

  • 使用 ASP.NET MVC 编写的 Azure 应用服务中的主 Web 门户
  • 执行业务逻辑的云服务工作者角色。辅助角色侦听门户写入的队列。由于依赖遗留的 C++ 业务逻辑,我必须为此使用云服务

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

我想我可以使用像 SignalR 客户端这样的 Azure 函数来执行此操作,可以触发该函数以强制 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
Run Code Online (Sandbox Code Playgroud)

在 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

Rob*_*gan 5

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

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