C# 事件发生时SqlDependency OnChange未触发

C# 事件发生时SqlDependency OnChange未触发,c#,sql-server,asp.net-mvc,signalr,sqldependency,C#,Sql Server,Asp.net Mvc,Signalr,Sqldependency,我知道有一个类似的问题,所以它有一个答案,在阅读了这篇文章和其他文章之后,我仍然不确定为什么我不能正确地把它连接起来。我已经尝试了很多例子,尝试了不同的东西,但根本无法让它工作。我知道有重构的机会,但我现在正试图保持它的简单,只是为了让它首先工作 我拥有数据库的权限,可以看到创建了一个临时服务和队列。但我注意到的一点是,如果我运行查询,队列不会显示任何记录,并且不会触发我的dependency\u OnChange事件。我假设它不会被解雇,因为没有任何东西进入队列 更新:我现在正在启动它,但是,

我知道有一个类似的问题,所以它有一个答案,在阅读了这篇文章和其他文章之后,我仍然不确定为什么我不能正确地把它连接起来。我已经尝试了很多例子,尝试了不同的东西,但根本无法让它工作。我知道有重构的机会,但我现在正试图保持它的简单,只是为了让它首先工作

我拥有数据库的权限,可以看到创建了一个临时服务和队列。但我注意到的一点是,如果我运行查询,队列不会显示任何记录,并且不会触发我的
dependency\u OnChange
事件。我假设它不会被解雇,因为没有任何东西进入队列

更新:我现在正在启动它,但是,我得到的唯一事件是
订阅
SqlNotificationEventArgs
Info
显示
Invalid
,但我的查询和表匹配所有
SELECT
sql依赖项规则

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:(这是一个简单的信号中心,从特定区域启动)

//
///发送通知。
/// 
[HubMethodName(“发送更新”)]
私有void SendUpdates()
{
var infectionPreventionItems=InfectionPreventionOperations.GetInfectionPrevention();
var vm=新的InfectionPreventionViewModel
{
传染预防=传染预防项目
};
var result=JsonConvert.SerializeObject(vm);
GetUpdates();
IHubContext context=GlobalHost.ConnectionManager.GetHubContext();
context.Clients.All.receiveUpdates(结果);
}
/// 
///获取更新。
/// 
私有void GetUpdates()
{
const string commandText=@“从[TestDb].[dbo].[Association]]中选择[Id],[FirstName]”;
使用(var连接=新的SqlConnection(EntityConnString))
{
connection.Open();
使用(var命令=新的SqlCommand(commandText,connection))
{
command.Notification=null;
var-dependency=newsqldependency(命令);
dependency.OnChange+=新的OnChangeEventHandler(sqlDependency\u OnChange);
if(connection.State==ConnectionState.Closed)
connection.Open();
//注意:您必须执行该命令,否则通知将永远不会触发。
使用(var reader=command.ExecuteReader())
{
}
}
}
}
/// 
///处理sqlDependency控件的OnChange事件。
/// 
///事件的来源。
///包含事件数据的实例。
私有void sqlDependency_OnChange(对象发送方,SqlNotificationEventArgs e)
{
//TODO:检查事件的类型
GetUpdates();
SendUpdates();
}
将此连接到RavenDB非常容易,但SqlServer让我很为难


GetUpdates
仅在发生集线器连接时触发一次,我认为这会启动依赖项。但是,在更新或向
关联
表中添加内容时,不会引发任何事件。我需要使用
signal
进行UI的实时更新,数据将通过第三方工具输入。非常感谢您的帮助。

您在更改时使用了哪些控件event@reds我不确定我是否理解这个问题。。。
    /// <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();
    }