2012-04-10 2 views
6

Я работаю над приложением, которое должно уведомить пользователя о получении нового уведомления. Приложение будет размещено на Azure и будет .NET MVC 3 (вероятно, не важно, но FYI). Я такжеSignalR push-уведомления всем экземплярам браузера одного пользователя, прошедшего проверку подлинности

Уведомления сохраняются в MSSQL db (2008) и имеют поле IsRead. Уведомления генерируются из различных действий пользователя и сервера. На основе пользовательских настроек некоторые уведомления будут созданы с помощью IsRead == false.

У меня есть 2 различных сценарии, которые я чувствую, что SignalR будет совершенным в обращении, мне просто нужно немного руководства:

  1. Пользователя имеет несколько открытых окон просмотр сайта и новую строку уведомлений добавляются, присвоенным для этого пользователя, с IsRead == true
    • Я хотел бы все экземпляры браузера конкретного пользователя, чтобы иметь определенную Js функции под названием, чтобы показать уведомление всплывал
  2. пользователя имеет несколько ветров ows open и нажимает на уведомление.
    • Я хотел бы, чтобы все экземпляры браузера конкретного пользователя имели функцию js, вызываемую для удаления уведомления. (Только конкретный экземпляр браузера, который обрабатывается щелчок будет также выполнять функцию JS, чтобы показать подробности уведомления)

То, что я пытался


Для первого сценария, я думаю, что те же действия, которые заставляют уведомление записываться в базу данных, будут обязаны уведомлять все экземпляры браузера пользователя.

Второй сценарий будет похож на то, что нажав на всплывающее окно, конечная точка сервера будет вызываться через Ajax, и эта конечная точка обновит db, чтобы пометить уведомление как прочитанное, а затем уведомить все экземпляры браузера другого пользователя ,

Если есть способ отслеживать клиентов SignalR на основе имени пользователя ASP.NET Forms Authentication, то я думаю, что это будет работать при решении проблем в обоих сценариях.

TL; DR


Моя главная проблема в том, что я не знаю, как сигнализировать все экземпляры браузера одного конкретного пользователя с помощью SignalR. Я думал о создании группы на основе имени пользователя аутентификации ASP.NET. Будет ли это работать? Есть ли более простой способ, который встроен в SignalR, который обрабатывает это?

ответ

15

Ваш звонок, чтобы создать группу с именем пользователя в качестве ключа, является хорошим, и я думаю, что это самый быстрый способ реализовать.Вы можете вызвать функцию каждый раз, когда страница загружается (и ConnectionID изменяются), подписавшись на:

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

И в ступице в коде:

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

И когда вы хотите обновить экраны клиента вы делаете:

Clients[username].refreshClientScreen(); 

Где refreshClientScreen() ваш Javascript которая выполняет работу по скрытию уведомления в браузере.

Другой способ сделать это - проверить ConnectionId по каждому запросу и иметь место, где вы регистрируете и сохраняете соединения пользователя на сервере. Когда вам нужно обновить их, вы можете использовать этот код на каждом из них:

Clients[ConnectionId].refreshClientScreen(); 

Вы можете найти ConnectionID в Context объекта концентратора.

Я думаю, что второй подход сложнее реализовать, поскольку вы должны управлять, где вы бы сохранить ConnectionId -s и подписаться на событие Disconnect от реализации IDisconnect, так что вы можете держать ConnectionID -s список вверх на сегодняшний день, поэтому я бы выбрал первый подход - тот, у кого есть группы.

+0

Благодарим вас за комментарий. Я попробую и посмотрю, как это работает! –

+0

Это сработало! Благодаря :) –