如何访问azure webrole中的信号器集线器

时间:2017-09-21 15:19:04

标签: c# azure signalr azure-web-roles signalr-hub

我有一个工作的SignalR Hub,它包含一些连续运行的方法,它们管理会话生命周期,连接会话......这些连续运行的方法使用Timer类每X秒执行一次。由于线程泄漏,性能问题,锁定......这真的不是一个好习惯。

更好的实现方法是拥有一个WebRole,所有这些“工人方法”应该放在WebRole.cs文件中,这很有意义,因为这是azure中角色的目的。 / p>

现在的问题是,它无法使用此代码获取集线器上下文的工作实例:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<AppHub>();
hubContext.Clients.All.Message("hello from webrole");

hubContext被实例化(所以不是null)但即便如此,仍然没有向客户端广播。没有错误也没有例外!

我想这是因为WebRole.csStartup.cs在不同的线程中被实例化了?

如何在WebRole.cs

中访问中心上下文

谢谢。

1 个答案:

答案 0 :(得分:0)

  

hubContext被实例化(所以不是null)但即便如此,仍然没有向客户端广播。没有错误也没有例外!

我可以在我身边重现同样的问题。要从WebRole.cs向客户端广播消息,您可以尝试安装Microsoft.AspNet.SignalR.Client并调用hub方法向客户端发送消息。以下代码在Compute Emulator中适用于我,您可以参考它。

<强> WebRole.cs

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        // For information on handling configuration changes
        // see the MSDN topic at https://go.microsoft.com/fwlink/?LinkId=166357.

        return base.OnStart();
    }

    public override void Run()
    {
        while (true)
        {
            System.Threading.Thread.Sleep(30000);

            var hub = new Microsoft.AspNet.SignalR.Client.HubConnection("http://localhost:57276/signalr/hubs");

            var proxy = hub.CreateHubProxy("ChatHub");
            hub.Start().Wait();

            //invoke hub method
            proxy.Invoke("mySend", "hello from webrole; " + DateTime.UtcNow.ToString());
        }         
    }


}

<强> ChatHub.cs

public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        Clients.All.addNewMessageToPage(name, message);
    }

    public void mySend(string message)
    {
        Clients.All.addNewMessageToPage("webrole", message);
    }
}

测试结果

enter image description here