Я пытаюсь использовать SqlDependancy
в проекте SignalR, но я не могу заставить событие OnChanged
срабатывать более одного раза. Сначала он запускается в событии подписки, но после внесения изменений в базовую базу данных он никогда не срабатывает. Я опустил свой код SignalR и контроллера, потому что проблема, похоже, лежит в классе репозитория. SqlDependancy.Start()
объявлен в моем классе Global.asax
.SqlDependency Only Fire On On Подписывается
Наблюдая за SQL-сервером, я вижу, что очередь уведомлений создается при запуске моего приложения и завершается, когда я закрываю.
public IEnumerable<Visitor> NotifyAllClients()
{
List<Visitor> visitors = new List<Visitor>();
using (var connection = new SqlConnection(new VisitorLogEntities().Database.Connection.ConnectionString))
{
using (var command = new SqlCommand(@"SELECT * FROM dbo.Visitors", connection))
//using (var command = new SqlCommand(@"SELECT [Id],[AgreeToTerms],[Base64Image],[CheckInDate],[CheckOutTime],[Company],[CountryOfOrigin],[email],[FirstName],[LastName],[IsInBuilding],[MeetingSubject],[MeetingTime],[PatriotHost],[phone],[title] FROM dbo.Visitors", connection))
{
var dependency = new SqlDependency(command);
dependency.OnChange += Database_OnChange;
if (connection.State == System.Data.ConnectionState.Closed)
connection.Open();
var reader = command.ExecuteReader();
while (reader.Read())
{
////compile visitor objects
////visitors.add(new Visitor());
}
}
return visitors.OrderByDescending(x => x.CheckInDate);
}
}
private void Database_OnChange(object sender, SqlNotificationEventArgs e)
{
//var dependency = (SqlDependency)sender;
//dependency.OnChange -= Database_OnChange;
////this fires once, with the Type of 'Subscribe', but then never fires on CRUD changes
if (e.Type == SqlNotificationType.Change)
{
VisitorHub.SendVisitors();
}
//NotifyAllClients();
}
редактировать: строки кода закомментирована выше, указывают на изменения, необходимые, чтобы получить эту работу правильно.
Я считаю, что вам нужно переписаться после каждого уведомления. http://stackoverflow.com/questions/15566966/sqldependency-onchange-not-firing – Dave
Я понимаю это, но если я переподписал его, он снова перезапустит обработчик OnChanged с типом «Подписаться». Какая часть кода в точности является повторной подпиской? Я предполагаю, что это метод command.ExecuteReader(), но как только это произойдет, подписка завершена. Где будет проходить эта подписка? –
Проверьте этот пример с помощью msdn https://msdn.microsoft.com/en-US/library/a52dhwx7(v=vs.80).aspx, обращая особое внимание на шаги 12 и 13 в приложении наблюдателя. На шаге 12 вы увидите удаление события onChange, а затем он вызывает шаг 13, который устанавливает его снова. – Dave