2010-02-10 17 views
6

Tenemos una biblioteca con una lógica muy compleja implementado en C. Tiene una interfaz de línea de comandos con argumentos no demasiado complejas basadas en cadenas. Para acceder a esto, nos gustaría envolver la biblioteca para que se pueda acceder con simple RPC XML o incluso con llamadas HTTP POST directas.Cómo envolver una biblioteca de C, de manera que pueda ser llamado desde un servicio web

Tener un poco de experiencia con Java, mi primera idea sería

  • Wrap la biblioteca en JNI/JNA
  • Uso Una pila WS delgada y un motor servlet
  • solicitudes de proxy a través de Apache para el servlet motor

Creo que ya debería haber algo simple que se pueda utilizar, así que estoy publicando esta pregunta aquí. Una solución tiene los siguientes requisitos

  • Se debe poder desplegarse a una distribución Linux actual, preferiblemente ya está disponible a través de la gestión de paquetes
  • Debe integrarse con un servidor web estándar (como en mi ejemplo Apache)
  • Pequeño cambios en la interfaz de la biblioteca debe ser manejable
  • de extremo a extremo (HTTP-WS-biblioteca-WS-HTTP) la solución no debería incurrir demasiado trabajo, pero la fiabilidad es muy importante

Como alternativa a la propuesta de JNI/JNA, Creo que en el C# mundo no debería ser demasiado difícil escribir un servicio web y llamar a esto no administrado módulo código, pero espero que alguien me puede dar algunas indicaciones que sean viables en lo que respecta a los requisitos.

Respuesta

1

Crear un módulo de apache es bastante fácil y, como ya está familiarizado con xmlrpc, debe consultar mod-xmlrpc2. Puede agregar fácilmente su código C a este módulo apache y tener un servidor xmlrpc en ejecución en los minutos

+0

He votado todas las buenas respuestas, pero esta es la ruta que realmente tomamos. Gracias, Bob. – Kariem

0

Depende de lo que la tecnología que se sienta cómodo, lo que ya ha instalado y trabajando en sus servidores, y cuáles son sus necesidades de carga son.

¿Qué hay de CGI en bruto? Suponiendo que el código C es sin estado entre las solicitudes, puede hacerlo sin modificar la biblioteca en absoluto. Escriba una secuencia de comandos simple que extraiga los parámetros de solicitud del entorno CGI, tal vez desinfecte la entrada, llame a la biblioteca a través de la interfaz de línea de comandos y empaquete el resultado en la respuesta HTTP que desee. A continuación, configure Apache para enviar la (s) URL (s) relevante (s) a este script. Python, por ejemplo, tiene soporte de biblioteca para XML-RPC, al igual que cualquier otro lenguaje de scripting utilizado en la web.

Los servlets parecen excesivos, pero por ejemplo, si desea realizar varias solicitudes por instancia de proceso CGI y no tiene ganas de involucrarse en la configuración de Apache, le resultará más fácil seguir con lo que sabe.

+0

Gracias, esta es una sugerencia muy directa y simple, que yo (curiosamente) realmente no había considerado. No debería ser demasiado complicado para hacer esto. La CLI para la biblioteca aún no está completa, pero creo que las llamadas directas a la API son (1) más estables y (2) mucho más rápidas. Sin embargo, creo que esta será la primera implementación que intentaremos. Gracias. – Kariem

1

Creo que también se puede publicar como un servicio web basado en SOAP. gSoap se puede usar para proporcionar la interfaz de servicio fuera de la biblioteca. ¿Has explorado gSOAP? Ver http://www.cs.fsu.edu/~engelen/soap.html

Saludos, Kangkan

2

Si vas con los servicios web, tal vez sería útil Soaplab. Básicamente es una herramienta para envolver las aplicaciones de línea de comandos existentes en los servicios web SOAP. Los servicios web que genera se ven un poco raros, pero es una forma bastante popular de hacer que algo así funcione.

0

Estoy haciendo algo similar con C++ en este momento. En mi caso, estoy escribiendo un módulo PHP para permitir que las secuencias de comandos PHP accedan a la lógica en mi biblioteca C++.

Puedo usar cualquier formato que quiera permitir que el resto del mundo lo vea - inicialmente solo será a través de una aplicación web PHP pero también desarrollaré una interfaz XML-RPC.

Cuestiones relacionadas