Обработчик 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>

Добавляем наш обработчик в секции и и отключаем кэширование, т.к. политика кэширования по изменению файла не работает в Linux. Если оставить режим кэширования включенным, изменения файла скрипта применятся после перезапуска mod-mono server или XSP.

Если необходимо загрузить какие-то дополнительные сборки, к примеру расширение для работы с БД, в секцию 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