Как можно использовать SignalR для реализации уведомлений в системе .NET 4.0, состоящей из приложения ASP.NET MVC 3 (которое использует проверку подлинности с помощью форм), базы данных SQL Server 2008 и службы MSMQ WCF (размещенной в WAS) для обработки данных? Среда выполнения состоит из IIS 7.5, работающего на Windows Server 2008 R2 Standard Edition.
Я только играл с образцами и не обладаю обширными знаниями о SignalR.
Вот немного предыстории
Веб-приложение принимает данные от пользователя и добавляет их в таблицу. Затем он вызывает одностороннюю операцию (с ключом базы данных) службы WCF для обработки данных (задачи). Веб-приложение возвращается на страницу, сообщающую пользователю, что данные были отправлены, и они будут уведомлены, когда обработка будет завершена. Пользователь может просмотреть страницу «индекс», чтобы увидеть, какие задачи завершены, не выполнены или выполняются. Они могут продолжать отправлять больше задач (что не зависит от предыдущих данных). Они могут закрыть свой браузер и вернуться позже.
Служба WCF на основе MSMQ считывает запись из базы данных и обрабатывает данные. Это может занять от миллисекунд до нескольких минут. Когда обработка данных завершена, запись обновляется соответствующим статусом (ошибка или сбой) и результатами.
Большую часть времени служба WCF не выполняет никакой обработки, однако, когда это происходит, пользователи обычно хотят знать, когда это будет сделано, как можно скорее. Пользователь по-прежнему будет использовать другие части веб-приложения, даже если у него нет данных для обработки службой WCF.
Вот что я сделал
На основной панели навигации у меня есть индикатор (похожий на Facebook или Google+), чтобы пользователь уведомлял их об изменении статуса задач. Когда они нажимают на нее, они получают сводку о том, что было сделано, а затем могут просмотреть результаты, если захотят.
Используя jQuery, я опрашиваю сервер на наличие изменений. Действие контроллера проверяет, есть ли какие-либо процессы, которые были изменены (завершены или не выполнены), и возвращает их, в противном случае ждет пару секунд и проверяет снова, не возвращаясь к клиенту. Во избежание тайм-аута на клиенте, он вернется через 30 секунд, если не было изменений. Сценарий jQuery ждет некоторое время и пытается снова.
Проблемы
Производительность снижается с каждым пользователем, который просматривает страницу. Специально им ничего делать не нужно. Мы заметили, что использование памяти Firefox 7+ и Safari со временем увеличивается.
Использование SignalR
Я надеюсь, что переход на SignalR может уменьшить количество опросов и, следовательно, снизить требования к ресурсам, особенно если в базе данных ничего не изменилось. У меня возникли проблемы с тем, чтобы служба WCF уведомляла клиентов о том, что она выполнена с обработкой задачи, учитывая тот факт, что она использует аутентификацию на основе форм.
Задав этот вопрос, я надеюсь, что кто-то даст мне лучшее представление о том, как они изменят мою схему уведомлений с помощью SignalR, если вообще изменят.