c# - 如何访问azure webrole中的signalr hub

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

我有一个工作的 SignalR Hub,其中包含一些连续运行的方法,它们正在管理 session 生命周期、连接 session ...这些连续运行的方法使用 Timer 类每 X 秒执行一次。这确实不是一个好的做法,因为线程泄漏、性能问题、锁......

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

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

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

hubContext 已实例化(因此不为空),但即便如此,仍然没有向客户端广播任何内容。没有错误,也没有异常!

我猜发生这种情况是因为 WebRole.csStartup.cs 是在不同的线程中实例化的?

如何访问 WebRole.cs 中的中心上下文?

谢谢。

最佳答案

hubContext is instantiated (so not null) but even so, still nothing is broadcasted to clients. No errors and no exceptions !

我可以在我这边重现同样的问题。要从 WebRole.cs 向客户端广播消息,您可以尝试安装 Microsoft.AspNet.SignalR.Client并调用 hub 方法向客户端发送消息。以下代码适用于我在计算模拟器中的情况,您可以引用它。

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

关于c# - 如何访问azure webrole中的signalr hub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46347641/

相关文章:

https - SignalR和HTTPS

c# - 如何在存储过程中抛出 SQLException

azure - 我可以从 Azure Analytics 作业输出到运行 SQL Server 的 VM 吗?

c# - 整个类型的 Json.NET 条件序列化

asp.net-mvc-4 - 在 Windows Azure 上使用 RavenDB Embedded 写入日志文件失败

c# - 在运行 select 之前检查容器/集合是否存在

c# - 如何在asp.net网站中使用signalr作为客户端?

c# - 集线器上的停止方法不会触发 onDisconnect

c# - 将base64字符串发送到c#服务器

c# - 使用基本身份验证将 cookie 添加到 Katana 托管的 WebAPI