Вопрос

Контекст: Из моего веб-интерфейса javascript я запускаю длительную (несколько минут) операцию, которая выполняется на серверной части .NET2.0.Вызов немедленно возвращается с идентификатором операции, в то время как длительная операция выполняется параллельно.Эти операции не требуют больших затрат процессора, но выполняют медленные сетевые вызовы.Как только операция будет завершена, я хочу увидеть результаты в веб-интерфейсе.

Вопрос: Как я могу уведомить клиента, когда работа будет выполнена?

Варианты, которые я рассматривал:

Вариант 1:Я запускаю длительную операцию асинхронно непосредственно из JS и ожидаю, что возвращаемым значением будет конечный результат вместо идентификатора операции.Моя библиотека AJAX позаботится обо всем, и жизнь выглядит очень простой и аккуратной.Проблема в том, что на стороне сервера поток - это поток ThreadPool, который я сейчас блокирую на несколько минут.Вам не нужно слишком много длительно выполняющихся параллельных запросов, чтобы вызвать истощение пула потоков и поставить весь сервер на колени, даже если имеется достаточная вычислительная мощность.

Вариант 2:С идентификатором операции я начинаю опрашивать сервер, завершена ли операция.Однако это атака типа "отказ в обслуживании" против моего собственного сервера.Кроме того, для этого должно быть справедливое ajax-решение.Это не уникальная проблема.

Это было полезно?

Решение

Проверьте Веб-синхронизация, реализация comet для .NET.Это должно быть именно то, что вы ищете.

Другие советы

Опрос, если он выполнен правильно, не окажет заметного влияния на загрузку вашего сервера.Вы должны настроить интервал, чтобы наилучшим образом отразить специфику работы вашего сервера - напримервы не проводите опрос сервера в течение как минимум 2 минут, если знаете, что операция обычно занимает больше времени.Даже после этого вы выбираете достаточно большой интервал - например10 сек.Использование запроса веб-службы или пользовательского обработчика сведет к минимуму трафик и серверное время, необходимые для обработки запроса.

Возможно, обратный ajax полезен, если у вас не слишком много одновременных клиентов.Это иногда называют кометой.

Обратный Ajax относится к шаблону проектирования Ajax, который использует долговечные HTTP-соединения для обеспечения связи с низкой задержкой между веб-сервером и браузером.По сути, это способ отправки данных с клиента на сервер и механизм для передачи данных сервера обратно в браузер (то, что вам нужно).

http://en.wikipedia.org/wiki/Reverse_Ajax

Похоже, это может удовлетворить ваши потребности, я просто использовал это, и это сработало действительно хорошо.

как насчет того, чтобы скрытый (или маленький) iframe запускал долго работающий скрипт и заставлял javascript проверять только содержимое iframe?например ,скрипт записывает идентификатор в iframe на своем конце.

Ваш вариант 2 - это именно то, что я делал раньше.Используйте setTimeout, чтобы ограничить опрос примерно каждые 30 секунд.

В Фреймворк ICEfaces обеспечивает Толчок AJAX ТЕХНОЛОГИЯ.Они поддерживают Масштабируемая Асинхронная Обработка запросов на различных серверах приложений, таких как Jetty, Tomcat и Glassfish.

Хотя все это относится к Java, это может помочь найти правильные поисковые запросы для Google.

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