Не то, чтобы я толкаю Flex по-фанатски, но на самом деле это та архитектура, которую мы регулярно внедряем во все наши приложения на базе Flex. Вот что мы делаем на Flex - без сомнения, его можно было бы соответствующим образом перевести на Silverlight:
Мы берем три компонента и объединяем их вместе, чтобы реализовать эту возможность:
- Шаблон кометы (HTTP-совместимый способ отправки push-уведомлений на сервере - дополнительную информацию можно найти в Википедии)
- Темы обмена сообщениями JMS (публикации / очереди подписчиков)
- Сервлет Adobe BlazeDS
Последний элемент реализует шаблон Comet, поддерживает маршалинг объектов AMF (двоичный формат сериализации Adobe для объектов ActionScript3) и соединяется с очередью или темой JMS. При соединении с темой несколько клиентов Flex, работающих в браузере, могут быть проксированы как подписчики на тему JMS. Поэтому, если какой-либо клиент публикует сообщение (или серверный код публикуется в теме), всем подписчикам клиента будет отправлено сообщение через BlazeDS и реализацию Comet Pattern.
Эффективно, вам нужно найти или написать компонент, который выполняет то, что делает BlazeDS. Вам также может понадобиться реализовать некоторый клиентский код, который взаимодействует с шаблоном Comet этого серверного компонента.
Поддерживает ли WCF шаблон Comet и двунаправленный обмен сообщениями? Особенно там, где соответствует HTTP и порт 80 или порт 443 для SSL. Похоже, вы уже изучили это и не нашли ничего для двунаправленного обмена сообщениями. Поэтому вам, возможно, придется закатать рукава и заняться кодированием.
Несколько замечаний по поводу отправки сервера в веб-приложение:
BlazeDS поддерживает два основных режима реализации шаблона Comet (на самом деле есть третий вариант опроса, но я его игнорирую):
- долго-опрос
- Потоковое HTTP
Долгосрочный опрос, который вы найдете более универсальным, поддерживается большинством веб-браузеров. Таким образом, вы могли бы упростить просто поддержать это на начальном этапе. Или вы могли бы потратить время на то, чтобы ваш клиентский код сначала попробовал потоковую передачу по HTTP и переключился на длительный опрос, если это необходимо.
Что касается брокера сообщений, который может обеспечить возможность публикации / приостановки, вы можете рассмотреть возможность использования ActiveMQ JMS. Это с открытым исходным кодом и бесплатно с активной поддержкой сообщества (вы также можете купить поддержку). Кроме того, вы можете использовать NMS для интеграции в качестве клиента .NET.
Наличие посредника сообщений, находящегося на среднем уровне, на самом деле важно, потому что это будет место для безопасного размещения сообщений. Если ваши клиенты проводят длинные опросы, вы не хотели бы, чтобы они пропускали какие-либо новые сообщения в течение интервала, когда они на самом деле не подключены.
Еще одна вещь, которую следует учитывать в сценариях с большим объемом трафика (сотни или тысячи клиентов, таких как веб-сайт в Интернете), вам необходимо иметь подход к масштабируемому шаблону кометы.
В мире Flex / Java сервлет BlazeDS (с открытым исходным кодом) был модифицирован для работы с асинхронной моделью. В Java слушатель сокетов может быть построен для использования каналов NIO и потоковых потоков Java Concurrency Executor. Веб-сервер Tomcat имеет приемник NIO и поддержку асинхронных событий Servlet 3.0. В частности, BlazeDS был модифицирован для работы с веб-сервером Jetty. Суть в том, что масштабируемость этого асинхронного подхода означает, что отдельный физический веб-сервер может быть расширен для поддержки примерно до 20 000 одновременных клиентских соединений в стиле Comet.
Прошло много времени с тех пор, как я серьезно занимался программированием на .NET, но привык к тому, что возможности io были очень похожи на Java 1.1, за исключением возможности асинхронного обработчика результатов. Это, однако, не то же самое, что создание асинхронных слушателей сокетов через каналы Java NIO. Реализация канала NIO может поддерживать от сотен до тысяч соединений сокетов с относительно небольшим пулом потоков. Но C # и .NET прошли через два или три значительных оборота - возможно, были добавлены новые возможности ввода-вывода, сравнимые с каналами NIO.