我試圖在SignalR項目中使用SqlDependancy
,但我似乎無法讓OnChanged
事件觸發多次。它首先在訂閱事件上觸發,但在對底層數據庫進行更改後,它再也不會觸發。我省略了我的SignalR和控制器代碼,因爲問題似乎存在於存儲庫類中。 SqlDependancy.Start()
在我的Global.asax
類中聲明。SqlDependency僅在訂閱時觸發
從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/zh-CN/library/a52dhwx7(v=vs.80).aspx查看此示例,特別注意觀察者應用程序中的步驟12和13。在步驟12中,您將看到onChange事件的刪除,然後調用步驟13再次設置它。 – Dave