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

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

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

  • оберните библиотеку в JNI, у/JNA
  • используйте тонкий стек WS и сервлет двигатель
  • запросы прокси через Apache к движку сервлета

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

  • Он должен быть развернут в текущем дистрибутиве linux, предпочтительно уже доступен через Управление пакетами
  • Она должна интегрироваться со стандартным веб-сервером (как в моем примере Например, Apache)
  • небольшие изменения в интерфейсе библиотеки должны быть управляемыми
  • End-to-end (HTTP-WS-library-WS-HTTP) решение не должно нести слишком много накладных расходов, но надежность очень важна

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

6 ответов


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


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


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

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


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

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

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


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

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


Если вы собираетесь вниз по маршруту JNI, проверьте SWIG. http://www.swig.org/Doc1.3/Java.html

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