Использование SqlCacheDependency для получения обновлений в реальном времени?- АСП.НЕТ

StackOverflow https://stackoverflow.com/questions/2033562

Вопрос

Я хотел бы отображать обновления в реальном времени на веб-странице (на основе поля состояния в таблице базы данных, которое изменяется внешним процессом).Согласно моим исследованиям, есть несколько способов сделать это.

  • Длинный опрос (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. Получение данных для отправки
  2. Передача данных клиентам

Пункт №1 прост, если предположить, что у вас достаточно эффективный запрос и вы не запрашиваете его для каждого пользователя;просто запросите, получите данные и нажмите их.Вы можете использовать опцию SqlDependency или просто опросить ее;это зависит от того, насколько тяжелы ваши данные.

Пункт №2 немного сложнее, поскольку вам придется либо постоянно подключаться к серверу, либо использовать сервер Comet.Мы написали хорошо масштабируемый сервер .NET Comet, Вебсинхронизация, в Frozen Mountain, это могло бы отвечать всем требованиям.По сути, у вас есть отдельный процесс, который управляет публикацией, а WebSync будет обрабатывать передачу данных вашим клиентам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top