Priya Karthish Ответов: 0

Sqldependency не срабатывает в ASP.NET с#


Я хотел, чтобы уведомление было показано, когда есть какие-либо изменения в базе данных. Я попробовал SQLDependency в консольном приложении(C#)(в качестве пробной версии), он работает идеально.
Теперь, когда я попробовал то же самое в WebForm(ASP.Net), событие не вызывает срабатывания. Я не знаю, где я ошибаюсь.

Что я уже пробовал:

<pre>namespace WebMessage
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        static string connectionString = @"Data Source=PBA-PC\SQLEXPRESS; Initial Catalog = MyDB; Integrated Security=SSPI;";
        
        public WebForm1()
        {
           
        }
        public void Page_Load(object sender, EventArgs e)
        {
            SqlDependency.Start(connectionString);
            getDataWithSqlDependency();
            HttpContext.Current.Response.Write("Waiting for Data Changes");
            // Console.WriteLine("Waiting for data changes");
            //Console.WriteLine("Press enter to quit");
            // Console.WriteLine(CanRequestNotifications().ToString());
            //Console.ReadLine();
            SqlDependency.Stop(connectionString);
        }
        static DataTable getDataWithSqlDependency()
        {
            //Console.WriteLine("getDataWithSqlDependency");
            using (var connection = new SqlConnection(connectionString))
            using (var cmd = new SqlCommand("SELECT ID,UserName,Email FROM dbo.[myUser]", connection))
            {
                var dt = new DataTable();
                // Create dependency for this command and add event handler
                var dependency = new SqlDependency(cmd);
                dependency.OnChange += new OnChangeEventHandler(OnChange);
                // execute command to get data
                connection.Open();
                dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));
                HttpContext.Current.Response.Write(dt.Rows.Count.ToString());
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    HttpContext.Current.Response.Write(dt.Rows[i]["UserName"].ToString());
                    HttpContext.Current.Response.Write(dt.Rows[i]["Email"].ToString());
                }
              
                return dt;
            }

        }
        static void OnChange(object sender, SqlNotificationEventArgs e)
        {
            HttpContext.Current.Response.Write($"OnChange Event fired. SqlNotificationEventArgs: Info={e.Info}, Source={e.Source}, Type={e.Type}.");
            if ((e.Info != SqlNotificationInfo.Invalid) && (e.Type != SqlNotificationType.Subscribe))
            {
                //resubscribe
                var dt = getDataWithSqlDependency();
                HttpContext.Current.Response.Write($"Data changed. {dt.Rows.Count} rows returned.");
            }
            else
            {
                HttpContext.Current.Response.Write("SqlDependency not restarted");
            }
            

        }
    }
}

Richard Deeming

Может быть, это как-то связано с тем, что ты звонишь SqlDependency.Stop немедленно, без выполнения какого-либо кода, который вызвал бы уведомление об изменениях?
SqlDependency в an ASP.NET приложение | Microsoft Docs[^]

Priya Karthish

В ConsoleApplication он работает идеально. только в веб-форме, не работает. Так что только я в замешательстве

0 Ответов