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

joe*_*ish 8 javascript notifications signalr

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

通知保存在MSSQL数据库(2008)中并有一个IsRead字段.通知是从各种用户和服务器操作生成的.根据用户首选项,将创建一些通知IsRead == false.

我有2种不同的场景,我觉得SignalR在处理方面会很完美,我只需要一些指导:

  1. 用户有几个窗口打开浏览网站,并添加了一个新的通知行,分配给该用户 IsRead == true
    • 我希望所有特定用户的浏览器实例都有一个特定的js函数来调用以显示弹出的通知
  2. 用户打开了几个窗口,然后单击弹出的通知.
    • 我希望所有特定用户的浏览器实例都有一个特定的js函数调用来删除弹出的通知.(只有处理点击的特定浏览器实例也会执行js函数来显示通知详细信息)

我试过的


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

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

如果有一种方法可以根据ASP.NET Forms Authentication Username跟踪SignalR客户端,那么我认为这将有助于解决两种情况下的问题.

TL; DR


我的主要问题是我不知道如何使用SignalR向所有特定用户的浏览器实例发出信号.我正在考虑根据ASP.NET Forms Authentication Username创建一个组.这会有用吗?是否有一种更简单的方法可以内置到SignalR中来处理这个问题?

apo*_*lov 16

您打电话以使用用户名作为密钥是一个很好的组合,我认为这是最快的实施.您可以通过订阅以下内容每次加载页面(并更改ConnectionId)时调用函数:

$.connection.hub.start(function () {
    yourHub.register();
});
Run Code Online (Sandbox Code Playgroud)

而在Code中的后台:

public void Register()
{
    AddToGroup(username);
}
Run Code Online (Sandbox Code Playgroud)

当您想要刷新客户端的屏幕时,您可以:

Clients[username].refreshClientScreen();
Run Code Online (Sandbox Code Playgroud)

其中refreshClientScreen()是你的javascript函数,它在浏览器中隐藏通知.

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

Clients[ConnectionId].refreshClientScreen();
Run Code Online (Sandbox Code Playgroud)

您可以在Hub 的Context对象中找到ConnectionId.

我认为第二种方法难以实现,因为您必须管理保存ConnectionId -s的位置并通过实现IDisconnect订阅Disconnect事件,以便您可以使ConnectionId -s列表保持最新,所以我选择第一种方法 - 与群体的方法.