Приложение SqlDependency и asp.net mvc работает не полностью

У меня странная проблема и вопрос об использовании класса SqlDependency в обычном приложении Asp.net MVC.

У меня есть стандартный контроллер с кодом:

    public ActionResult Index()
    {
        RegisterNotification();
        return View();
    }

    public void RegisterNotification()
    {
        var cs = ConfigurationManager.ConnectionStrings["TestDb"].ConnectionString;
        var sql = @"Select Data From dbo.TestTable"; 
        using (var conn = new SqlConnection(cs))
        {
            conn.Open();
            using (var cmd = new SqlCommand(sql, conn))
            {
                cmd.Notification = null;
                var sqlDependency = new SqlDependency(cmd);
                sqlDependency.OnChange += SqlDependency_OnChange;
                cmd.ExecuteNonQuery();
            }
        }

    }

    public void SqlDependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            // call some SignalR method here and re-register notification
            RegisterNotification();
        }
    }

В Global.asax есть SqlDepndency инициализация (в методах начала и конца)

Ну, в первом запросе все работает отлично, но после некоторого обновления (полного запроса) SqlDependency_OnChange вызывается дважды, а следующее обновление вызывается четыре раза и т. д.

В консольном приложении этот код работает нормально.

Что-то не так с моим кодом?

(с использованием Sql 2012 и asp.net MVC 5.2.3 и сервера разработки VisualStudio IISExpress)

Спасибо


person Mennion    schedule 15.06.2016    source источник


Ответы (1)


Я думаю, вам нужно создать Singleton, который будет обрабатывать уведомления SqlDependency. Каждый раз, когда кто-то делает запрос, создается новый экземпляр вашего контроллера, который регистрируется для получения новых уведомлений. Когда вы получаете несколько уведомлений, я думаю, вы обнаружите, что уведомления получают разные экземпляры вашего контроллера.

Отличный пример этого здесь

person Eric Vaughan    schedule 15.06.2016
comment
Ты прав!. Спасибо за ответ. Это действительно глупая ошибка. :) - person Mennion; 16.06.2016