Веб-приложение ASP.NET MVC в реальном времени
Мне нужно добавить элемент "в реальном времени" в мое веб-приложение. В принципе, мне нужно обнаружить "изменения", которые хранятся в таблице SQL Server, и обновлять различные части пользовательского интерфейса при возникновении изменения.
В настоящее время я делаю это, опросив. Я отправляю запрос ajax на сервер каждые 3 секунды с просьбой о любых новых изменениях - они затем возвращаются и обрабатываются. Он работает, но мне это не нравится - это означает, что для каждого браузера я часто выдаю эти запросы, и сервер всегда будет занят их обработкой. Короче говоря, он плохо масштабируется.
Есть ли какая-нибудь умная альтернатива, которая позволяет избежать накладных расходов?
Edit
В интересах полноты, я обновляю это, чтобы упомянуть решение, с которым мы в конечном итоге пошли - SignalR. Это ОС и происходит от Microsoft. Он вырос в популярности, и я могу от души рекомендовать это, или даже WebSync, на который мы также смотрели.
Ответы
Ответ 1
Посмотрите WebSync, кометный сервер, созданный для ASP.NET/IIS.
В частности, я бы использовал класс SQL Dependency, и когда вы обнаружите изменение, используйте RequestHandler.Publish( "/channel" , data); для отправки информации соответствующим слушающим клиентам.
Должно работать очень красиво.
Ответ 2
взятый непосредственно из ссылки, на которую ссылается Якуб (т.е.):
Обратный AJAX с IIS/ASP.NET
PokeIn on codeplex дает вам расширенную функциональность JSON, чтобы сделать ваши серверные объекты доступными на стороне клиента. Просто это обратная библиотека Ajax, которая позволяет легко вызвать функции JavaScript из С#/VB.NET и вызвать функции С#/VB.NET из JavaScript. Он имеет множество функций, таких как упорядочение событий, управление ресурсами, обработка исключений, маршалинг, контроль загрузки Ajax, моно совместимость, WCF и интеграция .NET Remoting и масштабируемый серверный push.
Существует бесплатный вариант лицензии сообщества для этой библиотеки, и вариант лицензирования довольно рентабелен по сравнению с другими.
Я действительно использовал это, и издание сообщества довольно особенное. стоит посмотреть, как этот тип технологий начнет доминировать над ландшафтом в ближайшие месяцы/годы. сайт codeplex поставляется с образцами asp.net mvc.
Ответ 3
Независимо от того: вы всегда будете ограничены тем фактом, что HTTP (в основном) - улица с односторонним движением. Если вы не реализуете какой-либо разумный код на клиенте (т.е. Слушать входящие сетевые запросы), все остальное будет включать в себя опрос сервера на наличие обновлений, неважно, что вам скажут другие.
У нас было аналогичное требование: иметь очень быстрое время отклика в одном из наших веб-приложений в режиме реального времени, обслуживая около 400 - 500 клиентов на веб-сервер. Серверу необходимо будет уведомить клиентов почти в течение 0,1 секунды (телефония и VoIP).
В итоге мы внедрили Async Handler. По каждому запросу опроса мы помещаем запрос в режим ожидания в течение 5 секунд, ожидая, что импульсный сигнал семафора будет отвечать клиенту. Если 5 секунд, мы ответим "без события", и клиент снова отправит запрос (сразу). Это привело к очень быстрому отклику, и у нас никогда не было проблем с до 500 клиентов на машину. Не знаю, сколько еще мы могли бы добавить до того, как запросы опроса могут создать проблему.
Ответ 4
взгляните на эту статью
Я где-то читал (не помню, где), что использование этой функции WCF заставляет обрабатывать запросы хоста таким образом, чтобы не использовать блокированные потоки.
Ответ 5
В зависимости от ограничений для вашего приложения вы можете использовать Silverlight для этого соединения. Вам не нужно иметь какой-либо пользовательский интерфейс для Silverlight, но вы можете использовать Сокеты имеют соединение, которое принимает на стороне сервера данные.