2015-04-16 3 views
2

У меня есть большая таблица, содержащая элементы, которые обычно содержат несколько новых элементов, вставленных каждую секунду. Я хочу создать приложение реального времени, в котором пользователи могут подписаться на определенные типы элементов и иметь канал в реальном времени всякий раз, когда вставлен элемент определенного типа.Нажатие новых сообщений с SignalR и SqlDependency

В начале я использовал http://techbrij.com/database-change-notifications-asp-net-signalr-sqldependency, но в нем отсутствуют некоторые важные детали, которые я не знаю, как реализовать.

Каков наилучший способ отслеживать, какие сообщения нажать, на какие клиенты? Как я могу отслеживать, какие сообщения уже были отправлены без накладных расходов на обновление флага «push» каждый раз, когда получено обновление?

+0

Ill должны следовать вместе с демо и посмотреть сегодня вечером, если нет ответа. – WindRaven

+0

Временные отметки, сравнение состояния и т. Д. - единственный способ, которого я боюсь. – Anders

+1

Что делать, если я создал другую sqldependency для каждого «типа» элемента, который в настоящее время контролируется? Когда сообщение отправляется, запрос sqldependency будет обновлен до id> lastsent? Правильно ли это будет? – phosplait

ответ

1

Вы можете использовать реализацию с открытым исходным кодом класса SqlDependency - SqlDependencyEx. Он использует триггер базы данных и собственное уведомление Service Broker для получения событий о изменениях таблицы. Проект тестирования для этого компонента что вы ищете. Это пример использования:

int changesReceived = 0; 
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
      TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{ 
    sqlDependency.TableChanged += (o, e) => changesReceived++; 
    sqlDependency.Start(); 

    // Make table changes. 
    MakeTableInsertDeleteChanges(changesCount); 

    // Wait a little bit to receive all changes. 
    Thread.Sleep(1000); 
} 

Assert.AreEqual(changesCount, changesReceived); 

С SqlDependecyEx вы в состоянии контролировать INSERT, DELETE, UPDATE отдельно и получить фактические измененные данные (xml) в случае объектно арг. Надеюсь, эта помощь.

0

SignalR предоставляет Context.ConnectionId в концентраторе. Вы можете использовать это как ключ в коллекции, чтобы отслеживать, какие элементы были отправлены.

Вот пример из приложения протоколирования чата я писал:

public class PushNotificationHub : Hub {   

    public void Send(string name, string message) { 
     ChatService.ChatUsers[Context.ConnectionId].AddMessage(message); 
     Clients.All.addMessage(name, message); 
    } 

    public override Task OnConnected() { 
     ChatService.Current.LogMessage($"Client connected: {Context.ConnectionId}"); 
     ChatService.ChatUsers.Add(Context.ConnectionId, new Common.ChatUser(Context.QueryString["name"])); 

     return base.OnConnected(); 
    } 

    public override Task OnDisconnected(bool stopCalled) { 
     //Application.Current.Dispatcher.Invoke(() => ((MainWindow)Application.Current.MainWindow).LogMessage($"Client disconnected: {Context.ConnectionId}")); 
     ChatService.Current.LogMessage($"Client disconnected: {Context.ConnectionId}"); 
     ChatService.Current.LogMessage(ChatService.ChatUsers[Context.ConnectionId].PrintLog()); 

     return base.OnDisconnected(stopCalled); 
    } 
}