Обработчик HTTP-вызовов
Компонент HttpService позволяет создавать HTTP сервисы в среде OneScript, аналогично тому, как это делается в 1С:Предприятие. Поведение и функционал, аналогичны платформе 1С:Предприятие 8.3 (8.3.10.2252), с незначительными отличиями.
Компонент создан на основе технологии ASP.NET и позволяет создавать HTTP сервисы в операционных системах Windows и Linux.
Технически, компонент представляет собой модуль-обработчик ISAPI, вызываемый веб-сервером при обращении к ресурсу *.os.
Отличия от 1С:Предприятие
В отличии от HTTP сервисов 1С:Предприятия, где построение URL запроса строится следующим образом:
http(s)://ИмяСервера:Порт//ИмяИнформационнойБазы/hs/КорневойURL/Шаблон[?ПараметрыЗапроса]
, в настоящем расширении, URL запроса строится также, как при обращении к обычному сайту:
http(s):Порт//ПутьКФайлуOS/ФайлСкрипта.os[?ПараметрыЗапроса].
Данное отличие связано с отсутствием в OneScript информационной базы и каких-либо объектов, соответствующих шаблонам 1С. В отличии от 1С:Предприятия, где все обработчики, связанные с определенным WEB-сервисом располагаются в одном модуле, в настоящем расширении, для обработки вызова сервиса используется одна предопределенная функция на скрипт. При необходимости эмуляции поведения платформы, необходимо создать несколько скриптов, которые будут соответствовать шаблону 1С, разместить в них функции обработки соответствующих методов и вызывать их из предопределенной функции. В связи с отсутствием шаблонов HTTP сервиса, Свойство ПараметрыURL не будет содержать каких-либо элементов.
Создание скрипта HTTP сервиса
Скрипт HTTP сервиса, представляет собой обычный текстовый файл, содержащий код на языке OneScript, который должен содержать предопределенную экспортную функцию ОбработкаВызоваHTTPСервиса, которая аналогично обработчику 1С:Предприятие имеет один параметр, типа HTTPСервисЗапрос и должна возвратить объект типа HTTPСервисОтвет. Ниже представлен типовой фрагмент кода в скрипте HTTP сервиса:
// Методы, аналогичные обработчикам запросов в 1С:Предприятие.
// Могут быть перенесены из конфигурации с учетом совместимости с объектами OneScript
Функция МетодОбработкиGET(Запрос)
Возврат Новый HTTPСервисОтвет(200);
КонецФункции
Функция МетодОбработкиPOST(Запрос)
Возврат Новый HTTPСервисОтвет(200);
КонецФункции
// Предопределенная функция. Является точкой входа в обработку запроса.
Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт
Если Запрос.HTTPМетод = "GET" Тогда
Возврат МетодОбработкиGET(Запрос);
ИначеЕсли Запрос.HTTPМетод = "POST" Тогда
Возврат МетодОбработкиPOST(Запрос);
Иначе
Возврат Новый HTTPСервисОтвет(200);
КонецЕсли;
КонецФункции
Производительность
В синтетических нагрузочных тестах обработчик 1Script показал производительность примерно сравнимую с php (1Script немного медленнее).
Сравнение с 1С не проводилось в виду существенно разных конвейеров обработки вызова в 1С и внутри 1Script. Обработчик вызова 1С существенно тяжелее за счет механик авторизации, сеансов и т.п. Сложно создать условия, при которых можно было бы уравнять накладные расходы на вызов http внутри 1С.
Размещение сервиса на WEB-сервере
Нижеследующая инструкция предназначена для развертывания с целью тестирования. Развертывание в продуктивных средах необходимо производить в соответствии с документацией к продуктам.
Windows
- При необходимости установите .NET Framework версии не ниже 4.5.2.
- Установите роль WEB-сервера.
- Создайте web приложение в IIS менеджере.
- Установите для приложения классический пул .NET.
- В свойствах пула выберите соответствующую версию .NET.
- Создайте в папке приложения папку Bin и скопируйте в нее результаты компиляции проекта ASPNETHandler.
- Скопируйте в папку приложения файлы .os
- Создайте в папке приложения файл web.config примерно следующего содержания:
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.os" type="OneScript.ASPNETHandler.ASPNETHandler, ASPNETHandler" />
</httpHandlers>
<customErrors mode="Off"/>
</system.web>
<system.webServer>
<handlers>
<add name="OneScript" path="*.os" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="File" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
</handlers>
</system.webServer>
<appSettings>
<add key="CachingEnabled" value="true"/>
</appSettings>
</configuration>
Нижеследующая строка добавляет наш обработчик запросов для файлов .os в текущее приложение. Обработчик имеет тип OneScript.ASPNETHandler.ASPNETHandler и находится в сборке ASPNETHandler.
<add verb="*" path="*.os" type="OneScript.ASPNETHandler.ASPNETHandler, ASPNETHandler" />
Далее добавляем ISAPI модуль, для обработки запросов к файлам .os. В качестве модуля используется модуль aspnet_isapi.dll, который идет в поставке .NET. Он может быть добавлен из консоли IIS.
<add name="OneScript" path="*.os" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="File" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
Разрешаем кэширование. Файлы .os будут кэшироваться в памяти до тех пор, пока они не будут изменены.
<add key="CachingEnabled" value="true"/>
Если необходимо загрузить какие-то дополнительные сборки, к примеру расширение для работы с БД, в секцию appSettings необходимо добавить примерно следующую строку:
<add key="ASPNetHandler" value="attachAssembly"/>
где key - это имя файла сборки. Файл должен находиться в папке Bin
Linux
Ниже описан пример установки на Ubuntu 16.04 LTS. Данный пример может использоваться только для тестовой установки. Установку в продуктивных средах необходимо производить в соответствии с документацией к продуктам. Установку Apache необходимо производить, если Вы планируете использовать связку Apache + mono-mod-server. Сервер XSP может работать без Apache, однако для доступа из интернет, необходимо использовать связку ngix+XSP или Apache+XSP.
Устанавливаем mono
sudo apt-get install mono-complete
Устанавливаем Apache
sudo apt-get install apache2
Устанавливаем mod-mono-server
sudo apt-get install mod-mono-server
В нашем случае будет установлен mod-mono-server4
Для mod-mono-server настраиваем обработку расширений .os
Добавляем строку Add-Type application/x-asp-net .os в файл /etc/mono-server4/mono-server4-hosts.conf
Устанавливаем XSP
sudo apt-get install mono-xsp4
Размещаем приложение
- Создаем папку Bin в папке /var/www/html
- Копируем в папку Bin результаты компиляции проекта ASPNetHandler
- Копируем в папку /var/www/html файлы скриптов (.os)
Конфигурируем приложение
Создаем в папке /var/www/html файл web.config, примерно следующего содержания:
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.os" type="OneScript.ASPNETHandler.ASPNETHandler" />
</httpHandlers>
<customErrors mode="Off"/>
</system.web>
<system.webServer>
<handlers>
<add name="OneScript" verb="*" path="*.os" type="OneScript.ASPNETHandler.ASPNETHandler" />
</handlers>
</system.webServer>
<appSettings>
<add key="CachingEnabled" value="false"/>
</appSettings>
</configuration>
Добавляем наш обработчик в секции
Если необходимо загрузить какие-то дополнительные сборки, к примеру расширение для работы с БД, в секцию appSettings необходимо добавить примерно следующую строку:
<add key="ASPNetHandler" value="attachAssembly"/>
где key - это имя файла сборки. Файл должен находиться в папке Bin
Применяем изменения
Перезагружаем сервис Apache
sudo service apache2 restart
Тестируем приложение
Для Apache + mod-mono-server обращаемся к web-сервису, к примеру при помощи браузера. Имеем в виду тот факт, что Apache регистрозависим и файлы Hello.os и hello.os будут разными файлами. Поскольку XSP не является службой, его необходимо запустить из корневой папки веб-приложений. Корневой папкой в нашем случае будет являться /var/www/html.
cd /var/www/html
XSP
Сервер запустится и сообщит параметры прослушивания. По умолчанию веб-слушатель настроен на порт 9000. Обращаемся к web-сервису из браузера или с помощью curl