SqlDependency non attiva



asp.net webforms (1)

Mi mancava: dependency.OnChange += new OnChangeEventHandler(OnChange); Il nuovo codice sarà simile a:

               SqlDependency dependency = new SqlDependency(command);

               dependency.OnChange += new OnChangeEventHandler(OnChange);

ora posso licenziare void OnChange(object sender, SqlNotificationEventArgs e)

Sto provando SqlDepenedency per la prima volta. Non ricevo notifiche sull'aggiornamento del database.

Sto posizionando i breakpoint all'interno: OnChange(object sender, SqlNotificationEventArgs e) ,

ma non viene mai colpito.

Ecco il mio codice:

    protected void Page_Load(object sender, EventArgs e)
    {

        Label1.Text = "Cache Refresh: " + DateTime.Now.ToLongTimeString();
        DateTime.Now.ToLongTimeString();
        // Create a dependency connection to the database.
        SqlDependency.Start(GetConnectionString());

        using (SqlConnection connection = new SqlConnection(GetConnectionString()))
        {
            using (SqlCommand command = new SqlCommand(GetSQL(), connection))
            {

                SqlDependency dependency =
                        new SqlDependency(command);

                    // Refresh the cache after the number of minutes
                    // listed below if a change does not occur.
                    // This value could be stored in a configuration file.
                                  connection.Open();

                dgHomeRequests.DataSource = command.ExecuteReader();
                    dgHomeRequests.DataBind();

            }
        }   
    }


    private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        //return "Data Source=(local);Integrated Security=true;" +"Initial Catalog=AdventureWorks;";
        return ConfigurationManager.ConnectionStrings["TestData"].ConnectionString;
    }
    private string GetSQL()
    {
        return "Select [Address] From [UserAccount1]";
    }


    void OnChange(object sender, SqlNotificationEventArgs e)
    {
        // have breakpoint here:
        SqlDependency dependency = sender as SqlDependency;

        // Notices are only a one shot deal
        // so remove the existing one so a new 
        // one can be added

        dependency.OnChange -= OnChange;

        // Fire the event
       /* if (OnNewMessage != null)
        {
            OnNewMessage();
        }*/
    }

Ho anche inserito del codice nel file Global.asax:

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        SqlDependency.Start(ConfigurationManager.ConnectionStrings["TestData"].ConnectionString);
    }
    protected void Application_End()
    {
        // Shut down SignalR Dependencies
        SqlDependency.Stop(ConfigurationManager.ConnectionStrings["TestData"].ConnectionString);
    }
}

Il server SQL si trova sulla macchina locale. Sto eseguendo il codice tramite Visual Studio (IIS Express).

  1. Per abilitare il broker di servizi sul database:

    SET ALTER DATABASE ENABLE_BROKER GO

  2. Per sottoscrivere la notifica della query, è necessario fornire il permesso all'account del servizio IIS

    GRANT SUBSCRIBE QUERY NOTIFICATIONS TO “<serviceAccount>”

Ho indovinato che il secondo punto non è necessario in quanto è locale. Ma ho provato a dargli alcune autorizzazioni. Non so se hanno ragione, perché non penso che stia utilizzando il pool di app. E non è necessaria l'autorizzazione per l'env locale. se io sono l'utente stesso e ho creato lo schema da solo.

Una delle domande che ho visto è stata la concessione:

alter authorization on database::<dbName> to [sa];

Ho dato anche questo permesso.