我知道在SO上有一个类似的问题有答案,在阅读了这篇文章和其他文章之后,我仍然不确定为什么我无法正确连接。我已经尝试了很多例子,并尝试过不同的东西,而且根本无法让它发挥作用。我知道有重构的机会,但我现在试图保持简单,只是为了让它先工作。
我拥有数据库的权限,我可以看到创建了一个临时服务和队列。我注意到的一件事是,如果我运行查询,队列不会显示任何记录,并且我的dependency_OnChange
事件不会被触发。我假设它没有被解雇,因为没有任何东西进入队列......
更新:我现在要点击它,但是,我得到的唯一事件是Subscribe
。 SqlNotificationEventArgs
显示Invalid
Info
,但我的查询和表格匹配sql依赖项的所有SELECT
规则。
的Global.asax:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
SqlDependency.Start(_entityConnString);
}
protected void Application_End()
{
SqlDependency.Stop(_entityConnString);
}
InfectionPreventionHub.cs: (这是一个以某个区域启动的简单SignalR Hub)
/// <summary>
/// Sends the notifications.
/// </summary>
[HubMethodName("sendUpdates")]
private void SendUpdates()
{
var infectionPreventionItems = InfectionPreventionOperations.GetInfectionPrevention();
var vm = new InfectionPreventionViewModel
{
InfectionPrevention = infectionPreventionItems
};
var result = JsonConvert.SerializeObject(vm);
GetUpdates();
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<InfectionPreventionHub>();
context.Clients.All.RecieveUpdates(result);
}
/// <summary>
/// Gets the updates.
/// </summary>
private void GetUpdates()
{
const string commandText = @"SELECT [Id], [FirstName] FROM [TestDb].[dbo].[Association]";
using (var connection = new SqlConnection(EntityConnString))
{
connection.Open();
using (var command = new SqlCommand(commandText, connection))
{
command.Notification = null;
var dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(sqlDependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
// NOTE: You have to execute the command, or the notification will never fire.
using (var reader = command.ExecuteReader())
{
}
}
}
}
/// <summary>
/// Handles the OnChange event of the sqlDependency control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="SqlNotificationEventArgs"/> instance containing the event data.</param>
private void sqlDependency_OnChange(object sender, SqlNotificationEventArgs e)
{
// TODO: Check for the type of event
GetUpdates();
SendUpdates();
}
将它连接到RavenDB真的很容易,但是SqlServer让我很难过。
GetUpdates
仅在集线器连接发生时触发一次,我认为这会启动依赖关系。但是,在更新或向Association
表添加内容时,不会引发任何事件。我需要使用SignalR
进行用户界面的实时更新,并且数据将通过第三方工具输入。任何帮助表示赞赏。