Использование SqlCacheDependency для получения обновлений в реальном времени?- АСП.НЕТ
-
19-09-2019 - |
Вопрос
Я хотел бы отображать обновления в реальном времени на веб-странице (на основе поля состояния в таблице базы данных, которое изменяется внешним процессом).Согласно моим исследованиям, есть несколько способов сделать это.
- Длинный опрос (Comet). Кажется, это сложно реализовать.
- Регулярный опрос. Я могу использовать метод AJAX, запускающий обращение к базе данных каждые 5 секунд, чтобы получить текущий статус.Но я боюсь, что это будет иметь проблемы с производительностью.
Затем я прочитал об использовании SqlCacheDependency
- в основном кеш становится недействительным на основе поля в таблице.Я предполагаю, что могу использовать событие, вызванное, когда кеш становится недействительным, чтобы показать пользователю новое обновление?
Какое простое решение не будет иметь проблем с производительностью?
Решение
Вместо опроса базы данных более масштабируемым и производительным подходом будет опрос на наличие файла на вашем веб-сервере, что-то вроде легковесного js-файла.Содержимое файла не важно, но чтобы вы имели представление, у вас может быть какой-то объект JSON, который более подробно описывает результат процесса.
Затем ваш фоновый процесс, выполняющий обработку на последнем этапе, может создать файл или вызвать для этого веб-службу на вашем веб-уровне.
Вот как это может работать.
Пользователи нажимают кнопку, которая отправляет сообщение на сервер
Сервер запускает процесс и возвращает идентификатор, например.C3201620-E622-4fe2-9F3A-E02FFA613F59
Затем веб-интерфейс периодически опрашивает наличие C3201620-E622-4fe2-9F3A-E02FFA613F59.js, javascript будет обрабатывать ошибку 404 и продолжать повторять попытки, пока не получит 200.
Надеюсь, это даст вам некоторые идеи.
Пример кода для обработки ошибок 404 в jQuery
$.ajax({
url: '/CheckForStatusChange/C3201620-E622-4fe2-9F3A-E02FFA613F59.json',
type: "GET",
success: function(result) {
},
error: function(request, status, error) {
//handle error here and setTimeOut
});
Другие советы
У вас есть 2 проблемы:
- Получение данных для отправки
- Передача данных клиентам
Пункт №1 прост, если предположить, что у вас достаточно эффективный запрос и вы не запрашиваете его для каждого пользователя;просто запросите, получите данные и нажмите их.Вы можете использовать опцию SqlDependency или просто опросить ее;это зависит от того, насколько тяжелы ваши данные.
Пункт №2 немного сложнее, поскольку вам придется либо постоянно подключаться к серверу, либо использовать сервер Comet.Мы написали хорошо масштабируемый сервер .NET Comet, Вебсинхронизация, в Frozen Mountain, это могло бы отвечать всем требованиям.По сути, у вас есть отдельный процесс, который управляет публикацией, а WebSync будет обрабатывать передачу данных вашим клиентам.