2017-09-13 50 views
2

我正在尝试使用我的Azure系统设置SignalR。该设置是相当标准的Azure的应用服务从Azure函数调用SignalR

  • 主要门户网站写在ASP.NET MVC
  • 执行业务逻辑的云服务工作者的角色。 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服务总线队列,这似乎是缩放时的建议。所以,在我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函数,并确保在浏览器中信号调用通过。

但是,我不确定这是否是正确的做法。在这种情况下,缩放是否会起作用,还是有更好的方法来迫使信号员将消息广播出去?

谢谢

+0

您应该接受Rob的回答作为答案。好的Stackoverflow礼仪。 – McGuireV10

回答

2

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

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