SignalR 将通知推送到单个经过身份验证的用户的所有浏览器实例

2024-03-04

我正在开发一个应用程序,需要在用户收到新通知时通知用户。该应用程序将托管在 Azure 上,并且将是 .NET MVC 3(可能不重要,但仅供参考)。我也

通知保存在 MSSQL 数据库 (2008) 中,并具有IsRead场地。通知是根据各种用户和服务器操作生成的。根据用户偏好,将创建一些通知IsRead == false.

我有两种不同的场景,我认为 SignalR 可以完美处理,我只需要一点指导:

  1. User has several windows open browsing the site and a new notification row is added, assigned to that user, with IsRead == true
    • 我希望所有特定用户的浏览器实例都调用特定的 js 函数来显示弹出通知
  2. User has several windows open and clicks on the notification pop up.
    • 我希望所有特定用户的浏览器实例都调用特定的 js 函数来删除弹出的通知。 (只有处理点击的特定浏览器实例也会执行js函数来显示通知详细信息)

我尝试过的


对于第一种情况,我认为导致通知写入数据库的相同操作将负责通知所有用户的浏览器实例。

第二种情况类似,通过单击弹出窗口,将通过 Ajax 调用服务器端点,并且该端点将更新数据库以将通知标记为已读,然后通知所有其他用户的浏览器实例。

如果有一种方法可以根据 ASP.NET 表单身份验证用户名跟踪 SignalR 客户端,那么我认为这将有助于解决这两种情况下的问题。

TL;DR


我的主要问题是我不知道如何使用 SignalR 向所有特定用户的浏览器实例发出信号。我正在考虑创建一个基于 ASP.NET 表单身份验证用户名的组。这行得通吗? SignalR 中是否有内置的更简单的方法来处理这个问题?


您呼吁建立一个以用户名作为密钥的组是一个很好的选择,我认为这是实施速度最快的。您可以在每次加载页面时调用一个函数(并且连接ID已更改)通过订阅:

$.connection.hub.start(function () {
    yourHub.register();
});

在代码隐藏的中心:

public void Register()
{
    AddToGroup(username);
}

当您想刷新客户端屏幕时,您可以执行以下操作:

Clients[username].refreshClientScreen();

Where 刷新客户端屏幕()是你的 javascript 函数,它负责在浏览器中隐藏通知。

另一种方法是检查连接ID在每个请求上,并在服务器上有一个地方可以注册并保留用户的连接。当您需要更新它们时,您可以在每个更新上使用此代码:

Clients[ConnectionId].refreshClientScreen();

您可以找到连接ID in the ContextHub 的对象。

我认为第二种方法更难实施,因为您必须管理保存文件的位置连接ID-s 并通过实现 IDisconnect 订阅 Disconnect 事件,这样您就可以保留您的连接ID-s 列表是最新的,所以我选择第一种方法 - 带有组的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SignalR 将通知推送到单个经过身份验证的用户的所有浏览器实例 的相关文章

随机推荐