Как перенести библиотеку C так, чтобы это можно было назвать от веб-сервиса

У нас есть библиотека с очень сложной логикой, реализованной в C. Это имеет интерфейс командной строки с не слишком сложные основанные на операция со строками аргументы. Для доступа к этому мы хотели бы перенести библиотеку так, чтобы к ней можно было получить доступ с простым RPC XML или даже простым HTTP вызовы POST.

Имея некоторый опыт с Java, моя первая идея была бы

  • Перенесите библиотеку в JNI/JNA
  • Используйте тонкий стек WS и механизм сервлета
  • Запросы прокси через Apache к механизму сервлета

Я полагаю, что должно уже быть что-то простое, которое могло использоваться, таким образом, я отправляю этот вопрос здесь. Решение имеет следующие требования

  • Это должно быть развертываемо на текущем дистрибутиве Linux, предпочтительно уже доступно через управление пакетом
  • Это должно интегрироваться со стандартным веб-сервером (как в моем Apache в качестве примера)
  • Небольшие изменения в интерфейсе библиотеки должны быть управляемы
  • Сквозной (HTTP-WS-library-WS-HTTP) решение не должно подвергаться слишком много служебному, но надежность очень важна

Кроме того, к предложению JNI/JNA, я думаю в мире C#, который не должно быть слишком трудно записать веб-сервису и назвать этот неуправляемый модуль кода, но я надеюсь, что кто-то может дать мне некоторые подсказки, которые выполнимы в отношении требований.

6
задан Kariem 10 February 2010 в 20:52
поделиться

6 ответов

Создать модуль apache довольно просто, и поскольку вы знакомы с xmlrpc, вам стоит проверить mod-xmlrpc2. Вы можете легко добавить свой код на C в этот модуль apache и получить работающий xmlrpc сервер за считанные минуты

1
ответ дан 17 December 2019 в 07:04
поделиться

Я думаю, вы также можете опубликовать его как веб-сервис на основе SOAP. gSoap можно использовать для предоставления интерфейса сервиса из библиотеки. Вы изучали gSOAP? Смотрите http://www.cs.fsu.edu/~engelen/soap.html

С уважением, Kangkan

1
ответ дан 17 December 2019 в 07:04
поделиться

Для этого можно использовать метод расширения Enumerable.StartMany .

Если я правильно прочитаю ваш код, код для этого будет:

var filteredCombinations = combinatedResults.SelectMany(o => o)
    .Where(value => value > 0)
    .Select(v => v.ToString());

Edit : Как указано выше, вышеупомянутый код не присоединяет каждый элемент подмножеств к последовательности, как это делает исходный код. Встроенные методы позволяют использовать регулярное выражение:

var filteredCombinations = combinatedResults
     .Where(resultSet => resultSet.Any(value => value > 0)
     .Select(resultSet => String.Join(",",
         resultSet.Where(value => value > 0)
                  .Select(v => v.ToString()).ToArray()));
-121--4554016-

A.

import re

m = re.match(r'\s*(?P<n>[-+]?[.0-9])\s*(?P<u>.*)', s)
if m is None:
  raise ValueError("not a number with units")
number = m.group("n")
unit = m.group("u")

Это даст вам число (целое число или фиксированная точка; слишком трудно отличить научное обозначение «e» от префикса единицы) с необязательным знаком, за которым следуют единицы, с необязательным пробелом.

Можно использовать re.compile () , если вы собираетесь выполнять много совпадений.

-121--4116938-

Зависит от того, какие технологии вам удобны, какие уже установлены и работают на серверах и каковы требования к загрузке.

Как насчет необработанной CGI? Предполагая, что код C не имеет состояния между запросами, вы можете сделать это без изменения библиотеки вообще. Напишите простой сценарий, который извлекает параметры запроса из среды CGI, возможно, устраняет входные данные, вызывает библиотеку через интерфейс командной строки и упаковывает результат в любой отклик HTTP. Затем настройте Apache для отправки соответствующих URL-адресов в этот сценарий. Например, Python поддерживает библиотеку XML-RPC, а также любой другой язык сценариев, используемый в Интернете.

Сервлеты звучат как переполнение, но, например, если вы хотите получить несколько запросов на экземпляр процесса CGI и не хотите участвовать в настройке Apache, то может быть проще всего придерживаться того, что вы знаете.

0
ответ дан 17 December 2019 в 07:04
поделиться

Если вы собираетесь использовать веб-службы, возможно, вам будет полезна Soaplab . По сути, это инструмент для обертывания существующих приложений командной строки в веб-службы SOAP. Создаваемые им веб-службы выглядят немного странно, но это довольно популярный способ заставить что-то подобное работать.

2
ответ дан 17 December 2019 в 07:04
поделиться

В данный момент я делаю то же самое с C ++. В моем случае я пишу модуль PHP, чтобы позволить сценариям PHP обращаться к логике в моей библиотеке C ++.

Затем я могу использовать любой формат, который я хочу, чтобы остальной мир мог его увидеть - сначала это будет просто веб-приложение PHP, но я также буду разрабатывать интерфейс XML-RPC.

0
ответ дан 17 December 2019 в 07:04
поделиться

Если вы идете по пути JNI, посмотрите SWIG. http://www.swig.org/Doc1.3/Java.html

При условии, что у вас есть заголовки для проектирования привязок, с swig довольно легко работать.

0
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: