8

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

通知保存在 MSSQL db (2008) 中并有一个IsRead字段。通知由各种用户和服务器操作生成。根据用户偏好,将使用IsRead == false.

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

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

我试过的


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

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

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

TL;博士


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

4

1 回答 1

16

您调用以用户名作为键的组的调用很好,我认为这是最快的实现。您可以通过订阅以下内容在每次页面加载(并且ConnectionId更改)时调用一个函数:

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

在后面的代码中心:

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

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

Clients[username].refreshClientScreen();

refreshClientScreen ()是您的 javascript 函数,它负责在浏览器中隐藏通知。

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

Clients[ConnectionId].refreshClientScreen();

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

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

于 2012-04-10T13:28:23.247 回答