【问题标题】:Asp.Net: send SignalR message on Application_EndAsp.Net:在 Application_End 上发送 SignalR 消息
【发布时间】:2020-07-07 11:47:12
【问题描述】:

我有一个标准的 Web 窗体应用程序,其中包括一个用于 JavaScript 客户端的 SignalR 集线器。集线器本身工作正常,消息按预期发送和接收。

当应用程序终止时(通常通过应用程序池回收),我想向所有连接的 SignalR 客户端发送特定消息。 所以我像这样连接到 Global.asax 的 Application_End:

void Application_End(object sender, EventArgs e)
{
            var hubNotifyTask = Task.Factory.StartNew(() =>
            {
                 IHubContext context = GlobalHost.ConnectionManager.GetHubContext<SiteMasterJsClientHub>();
                 context.Clients.Group("Group with all users").OnServerStartup("any message");
            });
}

嗯……这行不通。如果我将代码放在 Application_End 之外,它会起作用并且客户端会收到消息。 我的猜测是 SignalR 会自动检测应用程序关闭并终止所有连接。不过,我还没有找到任何文档来验证这一点。

所以我的问题是:如何在应用程序关闭之前发送自动 SignalR 消息?

【问题讨论】:

  • 你添加了RouteTable.Routes.MapHubs();到你的 Application_Start?
  • 我的路由配置看起来不同;但一般的集线器是有效的。我将 if 用于其他可以正常工作的事情。只是应用程序结束消息不起作用。
  • 好的,然后在camelCasing尝试这个方法sendNotificationWeekly()。
  • 请在中心类SiteMasterJsClientHub分享你的方法OnServerStartup
  • 正如我之前所说:代码在 Application_End 之外工作。我可以手动调用 OnServerStartup,客户端会收到消息并为其执行代码。

标签: asp.net signalr exit signalr-hub


【解决方案1】:

也许你可以试试 System.Web.Hosting 命名空间中的IRegisteredObject

首先,我们创建一个实现IRegisteredObject 接口的对象,并通过调用HostingEnvironment.RegisterObject 将其注册到ASP.NET 宿主环境中。当应用程序域即将卸载时,ASP.NET 托管环境将调用IRegisteredObjectStop 方法实现。

创建一个实现IRegisteredObject的类TerminationCommand

public class TerminationCommand : IRegisteredObject
{
    private readonly IHubContext siteMasterJsClientHub;
    public TerminationCommand()
    {
        siteMasterJsClientHub = GlobalHost.ConnectionManager.GetHubContext<SiteMasterJsClientHub>();
    }

    public void Stop(bool immediate)
    {
        siteMasterJsClientHub.Clients.Group("Group with all users").OnServerStartup("any message");
        HostingEnvironment.UnregisterObject(this);
    }
}

接下来我们需要在Application_Start部分注册我们的TerminationCommand

protected void Application_Start()
{
    //Existing code.
    HostingEnvironment.RegisterObject(new TerminationCommand());
}

参考文献

IRegisteredObject

HostingEnvironment.Registered method

【讨论】:

  • 您好,感谢您的想法。这并不能完全解决问题,因为集线器仍然可能在所有客户端收到消息之前关闭,但至少在某些情况下它可以工作。我会接受你的回答,因为它很有帮助。
猜你喜欢
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
相关资源
最近更新 更多