c# Долгий опрос с зависимостью SQL от IIS Inconsistent

Требование заказчика заключалось в том, чтобы иметь возможность видеть обновленные данные на экране всякий раз, когда происходят какие-либо изменения в конкретной таблице базы данных.

У нас есть таблица Job в БД, содержимое которой отображается в GridView в браузере. Требование состоит в том, чтобы обновлять данные сетки всякий раз, когда в таблице Jobs происходит какое-либо обновление, удаление или вставка.

Для реализации этого мы использовали зависимости от SQL и методы длительного опроса. Зависимость SQL будет уведомлять asp.net о любых изменениях в БД, а длительный опрос будет поддерживать асинхронное обновление сетки.

Мы развернули это в IIS 7.0 и заметили непоследовательное поведение, то есть представление сетки обновляется большую часть времени, скажем, 90-95%, но бывают случаи, когда обновление не происходит, хотя данные в таблице БД изменились.

Кто-нибудь сталкивался с этой проблемой? Требуется ли для этого какая-либо конкретная конфигурация в IIS? Я читал в нескольких местах, что IIS не масштабируется для кометного программирования. Приведенный выше сценарий происходит в тестовой среде только с одним пользователем. Любая помощь будет принята с благодарностью. Заранее спасибо.

Изменить: проблема, по-видимому, возникает и на сервере разработки ASP.Net, а не изолирована от IIS. После регистрации сообщений мы обнаружили, что SQLDependency — это то, что ломается, поскольку событие OnChange не запускается последовательно.

Редактировать 2: когда я запускаю запрос select * from sys.dm_qn_subscriptions, я получаю несколько строк для одной и той же подписки на уведомления, т. е. повторяющиеся подписки. Отличается только столбец id. Может ли это быть причиной? Если да, то почему я получаю повторяющиеся строки подписки? Как я могу убить подписку из ASP.NET?


person StewieHere    schedule 28.08.2012    source источник
comment
Не уверен, что правильно понял вашу настройку. Зачем вам нужно использовать SQL Dependency AND long polling? Вам вообще не нужно запрашивать БД, если вы используете SQL-зависимость, ваше приложение будет уведомлено при изменении БД.   -  person James    schedule 28.08.2012
comment
Вы пробовали регистрировать все события изменений, чтобы увидеть, есть ли конкретное условие, при котором изменение не запускается?   -  person linkerro    schedule 28.08.2012
comment
Когда он вышел из строя, вам удалось установить, какая часть сломалась? это был SqlDependency? или это был длинный опрос? Без этого знания это невозможный вопрос. Лично я бы больше склонялся к веб-сокетам и redis-pub/sub здесь... но я думаю, это зависит от ваших требований к масштабированию.   -  person Marc Gravell    schedule 28.08.2012
comment
взгляните на signalR и нокаут github.com /бдетчисон/   -  person JP Hellemons    schedule 28.08.2012
comment
или signalR и магистраль stackoverflow.com/questions/ 5112899/   -  person JP Hellemons    schedule 28.08.2012
comment
@MarcGravell Мы записали сообщения журнала в файл и после нескольких раундов тестирования пришли к выводу, что зависимость SQL не может вызвать событие Onchange. Стоит отметить, что DELETE имеет наибольшее количество сбоев по сравнению с INSERT и UPDATE.   -  person StewieHere    schedule 29.08.2012


Ответы (2)


Я считаю, что вам нужно внедрить COMET-or-Reverse-AJAX в свой проект,
есть хороший пример этого

http://www.codeproject.com/Articles/34562/COMET-or-Reverse-AJAX-based-Grid-Control-for-ASP-N

person Buzz    schedule 28.08.2012
comment
Я думаю, что это забегание вперед; сначала OP должен подтвердить, что это был неудачный длинный опрос... и затем есть множество вариантов, из которых это только один - person Marc Gravell; 28.08.2012
comment
@Marc: правда, есть и другие варианты, просто мое мнение, это хорошо работает для меня :) - person Buzz; 28.08.2012

Первое, что вам нужно сделать, это проверить таблицу dbo.AspNet_SqlCacheTablesForChangeNotification. Для каждой таблицы есть счетчики инвалидации кеша. Если цифры в порядке (100% приращение без потерь), рассмотрите возможность проверки уровня пользовательского интерфейса.

person eugenesqr    schedule 28.08.2012
comment
Я не вижу эту таблицу в нашей базе данных. Это потому, что мы не используем SQLCacheDependency? - person StewieHere; 29.08.2012
comment
да. Чтобы включить зависимость кэша SQL, вы должны использовать утилиту aspnet_regsql. Сначала включите эту функцию для базы данных, а затем для всех необходимых таблиц. Подробнее об этом можно прочитать на странице codeproject.com/Articles/14976/ASP. -NET-кэширование-зависимости - person eugenesqr; 30.08.2012