【问题标题】:How to call SignalR hub when application start?应用程序启动时如何调用 SignalR 集线器?
【发布时间】:2015-01-19 21:06:18
【问题描述】:

我的应用程序中有一些使用Hangfire 的重复性后台作业:

public class NotificationWeeklyHub : Hub
{
        public void SendNotificationWeekly()
        {
            /*Recurring Job
              Clients.All.SendNotificationWeekly();
            */
            // code....
        }
}

所以我想为我的用户发送通知,在这种情况下,我想在应用程序启动时调用我的 Hub,那么如何以这种方式调用我的 Hub?
PS:我调用集线器的客户端代码:

<script src="~/Scripts/jquery.signalR-2.1.2.min.js"></script>
<script src="~/signalr/hubs"></script>
<script src="~/Scripts/toastr.min.js"></script>
<script>

    var notifyWeekly = $.connection.notificationWeekly;
    notifyWeekly.client.sendNotificationWeekly = function () {
        toastr.success("Message");
    };

    $.connection.hub.start().done(function() {
        notifyWeekly.server.sendNotificationWeekly();
    });
</script>

我的目标只是在那些特定时间发送通知(在我的情况下使用toastr 库)。有什么想法吗?
提前致谢

【问题讨论】:

  • 要在应用程序启动后执行启动任务,请在 global.asax 文件中使用 Application_Start 事件
  • 如果您的应用程序刚刚启动,您将不会连接任何客户端....那么重点是什么?

标签: asp.net-mvc signalr hangfire


【解决方案1】:

类似的东西可以做到:

protected void Application_Start()
{
    // get the hub from the globalHost 
    IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationWeeklyHub>();

    // send the message to all clients, make sure that the method is camelCase.
    hubContext.Clients.All.sendNotificationWeekly("your message");
}

编辑:

现在关于您的集线器代码,看起来您的方法只是调用客户端,并且由于集线器中的任何公共方法都可供客户端使用,您可以清理集线器代码并将其更改为如下所示:

public class NotificationWeeklyHub : Hub
{
}

【讨论】:

  • 所以在这里我应该调用hubContext.Clients.All.sendNotificationWeekly("your message"); 在我的集线器方法里面呢?是否有必要在那里定义相同的调用?我的 Hub 类应该是没有 hub 方法的空类?对吗?
  • 你的hub中的任何公共方法都对客户端可用,如果这个方法只是调用客户端那么,是的你的hub应该是空的
猜你喜欢
  • 2014-11-14
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
相关资源
最近更新 更多