Использование SignalR с SqlDependency для отправки обновлений базы данных - PullRequest
4 голосов
/ 27 марта 2012

Возможно ли использовать SignalR в сочетании с SqlCacheDependency (или SqlDependency) для отправки обновлений базы данных непосредственно в браузер?Может быть, есть другой способ достижения этой функциональности?

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

Ответы [ 2 ]

5 голосов
/ 27 марта 2012

Вы должны иметь возможность использовать событие OnChange для SQLDependency . В вашем обработчике событий вы можете отправить сообщение через SignalR. Поскольку вы будете звонить в свой концентратор извне, вам необходимо использовать метод, показанный внизу документации здесь :

using SignalR.Infrastructure;

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>(); 
...
1 голос
/ 27 марта 2012

Хорошо, я понял это, или, по крайней мере, один из способов сделать это.

Сначала я не смог понять, что вам нужно использовать этот код из контроллера mvc, как только выСделав это, вы, очевидно, можете вызывать этот контроллер также из любого другого места или приложения, используя класс WebRequest .

@ Hightechrider Для полноты картины необходимо включить 2больше ссылок, чтобы заставить этот кусок кода работать.Этот демонстрационный код сделан с помощью PersistentConnection, но принцип для концентратора тот же, конечно.

РЕДАКТИРОВАТЬ: я сейчас использую поток внутри моего asp.net mvc для управления sqldependency, это похоже наболее комплексное решение.Проверьте этот пост о том, как реализовать фоновую обработку в asp.net «правильным способом» http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;    

using SignalR.Infrastructure;
using SignalR.Hosting.AspNet;
using SignalR;

namespace SignalRDemo.Controllers
{
    public class DemoController : Controller
    {
        public void sendMessage( string message)
        {
            IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
            IConnection connection = connectionManager.GetConnection<MyConnection>();

            connection.Broadcast(message);
        }
    }
}
...