Как использовать SignalR для уведомления веб-клиентов из ASP.NET MVC 3 о завершении задач MSMQ

Как можно использовать 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, если вообще будут.

16
задан bloudraak 17 November 2011 в 22:48
поделиться