Этот пост хотелось бы посвятить возможности интеграции двух платформ ASP.NET и Flex.
Как правило, Flash является прекрасным средством для создания насыщенных мультимедиа проектов, а с выходом ActionScript 3 и технологии Flex программировать стало одно удовольствие. При этом можно создавать и RIA, и desktop приложения (спасибо, Adobe AIR).
С другой стороны у нас ASP.NET — мощный инструмент для создания web-приложений. Можно использовать два совершенно разных подхода к построению приложения: либо использовать WebForms + Web Services, либо ASP.NET MVC, придерживаясь REST-стиля.
Прежде чем закончить лирическое отступление, хотелось бы обозначить инструменты, которые нам понадобятся.
Итак, это –
В качестве примера хотелось бы привести пример приложения, которое будет работать с часто обновляющимися данными и синхронизироваться с другими клиентами. Обычно в случае Flex используется либо AMF-streaming, либо RTMP-streaming. Для добавления поддержки со стороны сервера на помощь приходит библиотека FluorineFX. Сайт проекта и полезные ссылки здесь.
Перед созданием ASP.NET-приложения мы должны создать библиотеку, представляющую собой мини-сервер, инкапсулирующий в себе сервисы и логику для клиентов. Для этого создайте новый проект библиотеки на C# и назовите ServiceLibrary.
Для мониторинга активных клиентов, необходимо создать класс, наследуемый от MessagingAdapter и реализующий собой интерфейс ISessionListener.
Для клиентов, работающих через remoting, создадим сервис, который и будет предоставлять API.
На этом пока что код мини-сервера достаточен для использования. Каждый экземпляр класса будет создаваться при подключении нового клиента и работать в одном и том же домене, что и ASP.NET-приложение.
Работать веб-приложение будет на ASP.NET 4. Для этого создадим новый проект в студии.
Для подключений клиентов FluorineFX использует gateway, который представляет собой не что иное, как обычную ASPX страницу, запросы на которую http-модуль Fluorine’a и будет обрабатывать. Более подробно этот вопрос мы рассмотрим чуть ниже, а пока добавим обычную ASP.NET-страницу и назовем Gateway.aspx.
Сконфигурируем web.config
Замечу, что FluorineFX работает только с конфигурационными файлами, расположенными в папке WEB-INF. Именно так настраивается сервер под BlazeDS и LifeCycle Data Services.
А теперь создадим конфигурационные файлы. Для этого создайте папку WEB-INF в корневом каталоге и подпапку flex.
Добавьте xml-файл под названием services-config.xml.
Выше мы указали 2 end-point’a: для AMF и RTMP каналов, а также местонахождение двух конфигурационных файлов для клиентов, работающих через remoting и/или messaging. Добавим в ту же папку файлы remoting-config.xml и messaging-config.xml.
Теперь пришло время создания клиента. Первым делом создайте проект Flex во Flash Builder. Далее откройте свойства проекта > Компилятор Flex. В текстовом поле «Дополнительные аргументы компилятора» допишите следующую строку -services "{расположение_проекта}\WEB-INF\flex\services-config.xml". И, конечно же, добавить в проект ссылку на fds.swc для включения поддержки RTMPChannel. Данная библиотека входит в состав LCDS, однако если LCDS отсутствует, то в файлах в конце статьи он присутствует. В файле *.mxml приложения вставьте следующий код:
И последний штрих – это добавление метода SendMessage в наш AppAdapter для отправки сообщений с сервера клиенту.
AppAdapter.cs
В данном посте хотелось раскрыть основную суть возможности связывания Flex + ASP.NET. Конечно, не были раскрыты такие моменты как аутентификация и авторизация, строго типизированные ответы сервера, а не просто string и многое еще. Но об этом уже в следующий раз.
Весь код для Flex и сам солюшн с примером для VS 2010 можно скачать здесь.
Предисловие
Как правило, Flash является прекрасным средством для создания насыщенных мультимедиа проектов, а с выходом ActionScript 3 и технологии Flex программировать стало одно удовольствие. При этом можно создавать и RIA, и desktop приложения (спасибо, Adobe AIR).
С другой стороны у нас ASP.NET — мощный инструмент для создания web-приложений. Можно использовать два совершенно разных подхода к построению приложения: либо использовать WebForms + Web Services, либо ASP.NET MVC, придерживаясь REST-стиля.
Прежде чем закончить лирическое отступление, хотелось бы обозначить инструменты, которые нам понадобятся.
Итак, это –
- Visual Studio 2010 Professional
- Flash Builder 4 Standard
Встречайте, FluorineFX
В качестве примера хотелось бы привести пример приложения, которое будет работать с часто обновляющимися данными и синхронизироваться с другими клиентами. Обычно в случае Flex используется либо AMF-streaming, либо RTMP-streaming. Для добавления поддержки со стороны сервера на помощь приходит библиотека FluorineFX. Сайт проекта и полезные ссылки здесь.
Готовим сервер
Перед созданием ASP.NET-приложения мы должны создать библиотеку, представляющую собой мини-сервер, инкапсулирующий в себе сервисы и логику для клиентов. Для этого создайте новый проект библиотеки на C# и назовите ServiceLibrary.
Для мониторинга активных клиентов, необходимо создать класс, наследуемый от MessagingAdapter и реализующий собой интерфейс ISessionListener.
public class AppAdapter : MessagingAdapter, ISessionListener { public AppAdapter() { ClientManager.AddSessionCreatedListener(this); } #region ISessionListener Members public void SessionCreated(IClient client) { //Ваши действия при присоединении клиента client.AddSessionDestroyedListener(this); } public void SessionDestroyed(IClient client) { //Ваши действия при разъединении клиента } #endregion public override object Invoke(IMessage message) { //Здесь передается управление вашему коду для обработки пересылки сообщений return null; } }
Для клиентов, работающих через remoting, создадим сервис, который и будет предоставлять API.
[RemotingService()] public class DataService { public DataService() { } //Данный показательный метод будет использоваться клиентами. public string GetData() { return "Hello, world!"; } }
На этом пока что код мини-сервера достаточен для использования. Каждый экземпляр класса будет создаваться при подключении нового клиента и работать в одном и том же домене, что и ASP.NET-приложение.
Подготовка веб-приложения
Работать веб-приложение будет на ASP.NET 4. Для этого создадим новый проект в студии.
Для подключений клиентов FluorineFX использует gateway, который представляет собой не что иное, как обычную ASPX страницу, запросы на которую http-модуль Fluorine’a и будет обрабатывать. Более подробно этот вопрос мы рассмотрим чуть ниже, а пока добавим обычную ASP.NET-страницу и назовем Gateway.aspx.
Сконфигурируем web.config
<configuration> <configSections> <sectionGroup name="fluorinefx"> <section name="settings" type="FluorineFx.Configuration.XmlConfigurator, FluorineFx" requirePermission="false"/> </sectionGroup> </configSections> <fluorinefx> <settings> <rtmpServer> <threadpool minWorkerThreads="0" maxWorkerThreads="25" idleTimeout="60000"/> <rtmpConnection pingInterval="0" maxInactivity="60000" maxHandshakeTimeout="0"/> <rtmptConnection pingInterval="5000" maxInactivity="60000" maxHandshakeTimeout="5000"/> <rtmpTransport receiveBufferSize="4096" sendBufferSize="4096" tcpNoDelay="true"/> </rtmpServer> </settings> </fluorinefx> <system.web> <compilation debug="true" targetFramework="4.0" /> <httpModules> <add name="FluorineGateway" type="FluorineFx.FluorineGateway,FluorineFx" /> </httpModules> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules runAllManagedModulesForAllRequests="true"> <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx"/> </modules> </system.webServer> </configuration>
Замечу, что FluorineFX работает только с конфигурационными файлами, расположенными в папке WEB-INF. Именно так настраивается сервер под BlazeDS и LifeCycle Data Services.
А теперь создадим конфигурационные файлы. Для этого создайте папку WEB-INF в корневом каталоге и подпапку flex.
Добавьте xml-файл под названием services-config.xml.
<?xml version="1.0" encoding="utf-8" ?> <services-config> <services> <service-include file-path="remoting-config.xml" /> <service-include file-path="messaging-config.xml" /> </services> <channels> <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel"> <endpoint uri="http://{server.name}:{server.port}/Gateway.aspx" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <!-- <legacy-collection>true</legacy-collection> --> </properties> </channel-definition> <channel-definition id="my-rtmp" class="mx.messaging.channels.RTMPChannel"> <endpoint uri="rtmp://{server.name}:1950" class="flex.messaging.endpoints.RTMPEndpoint"/> </channel-definition> </channels> </services-config>
Выше мы указали 2 end-point’a: для AMF и RTMP каналов, а также местонахождение двух конфигурационных файлов для клиентов, работающих через remoting и/или messaging. Добавим в ту же папку файлы remoting-config.xml и messaging-config.xml.
Клиент Flex
Теперь пришло время создания клиента. Первым делом создайте проект Flex во Flash Builder. Далее откройте свойства проекта > Компилятор Flex. В текстовом поле «Дополнительные аргументы компилятора» допишите следующую строку -services "{расположение_проекта}\WEB-INF\flex\services-config.xml". И, конечно же, добавить в проект ссылку на fds.swc для включения поддержки RTMPChannel. Данная библиотека входит в состав LCDS, однако если LCDS отсутствует, то в файлах в конце статьи он присутствует. В файле *.mxml приложения вставьте следующий код:
<fx:Declarations> <mx:Consumer id="consumer" destination="data_destination" message="messageHandler(event)"/> <mx:RemoteObject id="dataRO" destination="DataDest"> <mx:method name="GetData" result="GetDataResult(event)" fault="GetDataFault(event)" /> </mx:RemoteObject> </fx:Declarations> <fx:Script> <![CDATA[ private function GetDataResult(event:ResultEvent):void { var result:String = event.result as String; //Ваш код } private function GetDataFault(event:FaultEvent):void{ var error:String = ObjectUtil.toString(event.fault); //Ваш код } private function messageHandler(event:MessageEvent):void { var msg:IMessage = event.message; var type:object = msg.body; //Ваш код } ]]> </fx:Script>
И последний штрих – это добавление метода SendMessage в наш AppAdapter для отправки сообщений с сервера клиенту.
AppAdapter.cs
public class AppAdapter : MessagingAdapter, ISessionListener { /* * ... */ public override object Invoke(IMessage message) { //Здесь передается управление вашему коду для обработки пересылки сообщений MessageService messageService = this.Destination.Service as MessageService; messageService.PushMessageToClients(message); return null; } public static void SendMessage(string message) { MessageBroker msgBroker = MessageBroker.GetMessageBroker(null); AsyncMessage msg = new AsyncMessage(); msg.destination = "data_destination"; msg.headers.Add(AsyncMessage.SubtopicHeader, "client"); msg.headers.Add(AsyncMessage.EndpointHeader, "my-rtmp"); msg.headers.Add(AsyncMessage.RemoteCredentialsHeader, string.Empty); msg.headers.Add(AsyncMessage.FlexClientIdHeader, Guid.NewGuid().ToString("D")); msg.clientId = Guid.NewGuid().ToString("D"); msg.messageId = Guid.NewGuid().ToString("D"); msg.timestamp = Environment.TickCount; msg.body = message; msgBroker.RouteMessage(msg); } }
Послесловие
В данном посте хотелось раскрыть основную суть возможности связывания Flex + ASP.NET. Конечно, не были раскрыты такие моменты как аутентификация и авторизация, строго типизированные ответы сервера, а не просто string и многое еще. Но об этом уже в следующий раз.
Весь код для Flex и сам солюшн с примером для VS 2010 можно скачать здесь.
