Веб-приложения реального времени. Веб-сокеты, IIS 8, библиотека SignalR и их использование в приложениях ASP.NET. Часть пятая, библиотека SignalR.

Если вы читали предыдущие статьи данного цикла, то уже должны знать и иметь некоторое представление о веб-приложениях реального времени. В частности был описан и показан протокол WebSocket, используя который можно писать такие приложения. Конечно, использование веб-сокетов является предпочтительным вариантом для построения таковых, но ввиду того, что не все платформы поддерживают данный протокол, и ввиду того, что он является достаточно новым, приходится использовать другие средства. Повторюсь, что даже имея последнюю, на данный момент, операционную систему Windows 8 (Windows Server 2012) приходится работать с веб-сокетами на достаточно низком уровне используя только те возможности, которые даёт платформа .NET Framework 4.5. Чтобы иметь возможность абстрагироваться от всего этого и как можно быстрее разрабатывать, была создана библиотека SignalR. Использование SignalR намного упрощает процесс вставки функциональности реального времени в веб-приложения. Как это обычно бывает, большую часть рутинного (и сложного) кода, которую должен был писать разработчик, она уже предоставляет для использования. То есть, используя данную библиотеку, можно сконцентрировать своё внимание только на логику приложения, что сильно облегчает процесс разработки. И так приступим к более подробному описанию. Официальный сайт библиотеки находится тут, и оттуда же можно скачать и посмотреть исходные коды. На момент написания статьи это версия 1.1.3. Открыв и посмотрев проект исходного кода, можно увидеть, что она состоит из множества состовляющих: серверных и клиентских частей, и не только.



В целом все клиентские и серверные компоненты библиотеки можно разделить на три основные состовляющие: транспорт, низкоуровневый API и базирующийся на нём API более высокого уровня. Начнём пожалуй с самого главного – транспорта. В качестве транспорта SignalR использует нижеперечисленные технологии, причём используется так называемый "резервный механизм" (от лучших к худшим, но более доступным). Порядок использования следующий.
  1. Протокол WebSocket (если обе стороны поддерживают его).
  2. События, посылаемые сервером (технология Server-Sent Events).
  3. Использование скрытого фрейма (Forever Frame).
  4. Использование длинного AJAX опроса  (Ajax long polling).
Два первых транспорта формально относятся к HTML 5. Хотя лично я, например, не очень то и люблю "привязывать" веб-сокеты к HTML 5. Самым лучшим транспортом, естественно, является WebSocket, именно его пытается выбрать приложение использующее SignalR, в качестве транспорта по умолчанию, если это конечно возможно.



Напомню, что данный протокол был описан в начале данного цикла статей. У него только один недостаток – возможность использования только с новейшим серверным ПО и браузерами. Хотя вариант с браузерами стоит не таким особняком, особенно это касается браузеров не от Microsoft (так как на данный момент веб-сокеты поддерживаются только IE 10). Если по той или иной причине не возможно использовать веб-сокеты, то в качестве второго варианта выбирается Server-Sent Events. Это специальная технология (или API), которая позваляет отправлять уведомления в виде событий объектной модели документа (DOM) от сервера к веб-браузеру. Более подробно о данной технологии можете почитать тут (ссылка на первоисточник). Если и этот транспорт не возможно использовать, то в "игру" вступает технология Comet, со своими двумя реализациями. Очень неплохо о технологии Comet написано в данной статье, рекомендую прочитать. За исключением первого пункта (веб-сокетов), остальные транспорты можно назвать костылями, особенно технологию Comet. Конечно, всё это со временем уйдёт в прошлое, но в близжайшем будущем без них никак. Так как сокеты не везде поддерживаются, а использовать функциональность веба реального времени очень хочется. К счастью, SignalR снимает с плеч разработчика заботу об этом. Более детально процесс выбора транспорта описан здесь, раздел "Transports and fallbacks". Что касается API, то есть его использования, ведь на одном только "транспорте" далеко не уедешь. Второй слой это низкоуровневый интерфейс прикладного программирования называемый Persistent Connections API (постоянные подключения). А третий слой – хабы, в основном используется он, называется Hubs API. Более подробное описание и использование данных API будет показано в следующих частях, на реальных примерах. Теперь, что касается поддержки со стороны клиентского и серверного ПО. Отмечу, что в роли клиента может выступать не только веб-браузер, но и обычные .NET приложения. Начнём со списка операционных систем, в который могут хоститься серверные компоненты библиотеки. Ниже показан  их список.
  • Windows Azure
  • Windows Server 2012 R2 и Windows 8.1
  • Windows Server 2012 и Windows 8
  • Windows Server 2008 R2 и Windows 7

Веб-сокеты поддерживаются только в версии Windows NT 6.2 и выше (Windows 8 и Windows 8.1 и их серверные версии). На момент написания статьи в Windows Azure они не поддерживаются. Но это не значит, что нельзя использовать SignalR в Azure, так как было показано, что она использует ещё несколько технологий в качестве транспорта. Использовать SignalR можно в .NET Framework 4 и 4.5, но опять-таки, веб-сокеты поддерживаются только начиная с .NET 4.5. Уже по списку операционных систем можно понять какие версии сервисов IIS поддерживают SignalR.

  • IIS 7.5
  • IIS 8 Express и IIS 8

На официальном сайте указана поддержка IIS 7, но мне лично не приходилось использовать данную версию сервиса с SignalR, поэтому ничего по этому поводу сказать не могу. Чтобы использовать SignalR в IIS 7.5 нужно следующее обновление. Добавлю, что конвейер обработки запросов ASP.NET должен работать в интегрированном режиме. Классический режим работы конвейера не поддерживается. И ещё, в виду того, что клиентские операционные системы Windows 7 и Windows 8 налагают ограничение в виде десяти одновремменных соединений при использовании полноценной версии IIS, для разработки рекомендуется использовать IIS Express, если данное ограничения является для вас препятствием. Как вы знаете IIS 8 Express можно установить на Windows 7, но этого не достаточно для использования веб-сокетов, так как поддержка веб сокетов реализована только в новых версиях ОС Windows,как отметил выше. Настало время описать версии клиентских систем, где поддерживаются клиентские компоненты SignalR. Тут уже ограничений намного меньше, поскольку SignalR может использоваться на различных клиентских платформах. В первую очередь это браузеры. Веб-приложение, которое использует SignalR должно использовать библиотеку jQuery версии 1.6.4 или выше. Список браузеров показан ниже.

  • Internet Explorer 8+
  • Mozilla Firefox
  • Google Chrome
  • Apple Safari
  • Opera

Официально и старые и новые версии браузеров поддерживают SignalR, но вот только стабильная работа гарантируется только с относительно новыми и новейшими версиями браузеров. Как я уже сказал выше использовать SignalR можно и в приложениях построенных на .NET. Это настольные приложения, приложения для Windows Store и Windows Phone. Больше сведений на этот счёт можно получить с сайта ASP.NET, а именно отсюда. Рекомендую почитать также список часто задаваемых вопросов. На этом общее обисание окончено, в следующих частях будут показаны примеры использования SignalR.