从Azure函数调用SignalR

时间:2017-09-13 13:03:21

标签: asp.net-mvc azure signalr azure-functions

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

  • 使用ASP.NET MVC编写的Azure App Service中的主Web门户
  • 执行业务逻辑的云服务工作者角色。 worker角色侦听门户网站写入的队列。由于依赖于传统的C ++业务逻辑,我不得不使用云服务

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

我认为我可以使用Azure函数(如SignalR客户端)来执行此操作,可以触发该操作以强制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 Service Bus队列,这似乎是扩展时的建议。所以,在我的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功能,并且在我的浏览器中确实可以通过信号器调用。

但是,我不确定这是否正确。在这种情况下,缩放是否会起作用,还是有更好的方法可以强制信号器广播消息?

谢谢

1 个答案:

答案 0 :(得分:4)

你有正确的想法。我正在运行相同的架构,除了我使用WebJob而不是Azure功能。几点:

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