2010-02-10 35 views
6

Chúng ta có một thư viện với logic rất phức tạp được thực hiện trong C. Nó có giao diện dòng lệnh với các đối số dựa trên chuỗi không quá phức tạp. Để truy cập vào điều này, chúng tôi muốn bọc thư viện để nó có thể được truy cập bằng RPC XML đơn giản hoặc thậm chí các cuộc gọi HTTP POST đơn giản.Làm thế nào để bọc một thư viện C để nó có thể được gọi từ một dịch vụ web

Có một số kinh nghiệm với Java, ý tưởng đầu tiên của tôi sẽ là

  • Bó thư viện trong JNI/JNA
  • Sử dụng một WS chồng mỏng và một servlet engine
  • yêu cầu Proxy thông qua Apache để servlet engine

Tôi tin rằng cần phải có một cái gì đó đơn giản mà có thể được sử dụng, vì vậy tôi đăng câu hỏi này ở đây. Một giải pháp có các yêu cầu sau

  • Nó sẽ được triển khai tới một bản phân phối Linux hiện nay, tốt hơn đã có sẵn thông qua quản lý gói
  • Nó cần tích hợp với một máy chủ web chuẩn (như trong ví dụ của tôi Apache)
  • nhỏ thay đổi giao diện của thư viện nên có thể kiểm soát được
  • End-to-end (HTTP-WS-thư viện-WS-HTTP) là giải pháp nên không phải chịu quá nhiều chi phí, nhưng độ tin cậy là rất quan trọng

Ngoài đề xuất JNI/JNA, tôi nghĩ rằng trong thế giới C# không nên quá khó để viết một dịch vụ web và gọi đây là mô-đun không được quản lý, nhưng tôi hy vọng ai đó có thể cung cấp cho tôi một số gợi ý các yêu cầu.

Trả lời

1

Tạo một module apache là khá dễ dàng và từ quen thuộc của bạn với XmlRpc bạn nên kiểm tra mod-xmlrpc2. Bạn có thể dễ dàng thêm mã C của bạn để module apache này và có một máy chủ chạy XmlRpc trong vài phút

+0

Tôi đã bỏ phiếu cho tất cả các câu trả lời hay, nhưng đây là con đường chúng tôi thực sự đã thực hiện. Cảm ơn, Bob. – Kariem

0

Phụ thuộc vào công nghệ nào bạn cảm thấy thoải mái, những gì bạn đã cài đặt và làm việc trên máy chủ của mình và yêu cầu tải của bạn là gì.

Làm thế nào về CGI nguyên? Giả sử mã C là không trạng thái giữa các yêu cầu, bạn có thể làm điều này mà không cần sửa đổi thư viện. Viết một kịch bản lệnh đơn giản để kéo các tham số yêu cầu ra khỏi môi trường CGI, có thể khử trùng đầu vào, gọi thư viện qua giao diện dòng lệnh và gói kết quả vào bất kỳ phản hồi HTTP nào bạn muốn. Sau đó cấu hình Apache để gửi (các) URL có liên quan đến tập lệnh này. Python, ví dụ, có hỗ trợ thư viện cho XML-RPC, và cũng như mọi ngôn ngữ kịch bản khác được sử dụng trên web.

Servlets nghe có vẻ quá mức cần thiết, nhưng nếu bạn muốn nhiều yêu cầu cho mỗi quá trình xử lý CGI, và không muốn tham gia vào cấu hình Apache, thì có thể dễ dàng nhất với những gì bạn biết.

+0

Cảm ơn bạn, đây là một gợi ý rất thẳng thắn và đơn giản, mà tôi (đủ kỳ lạ) đã không thực sự xem xét. Nó không nên quá phức tạp để làm điều này. CLI cho thư viện chưa hoàn thành, nhưng tôi tin rằng các cuộc gọi API trực tiếp là (1) ổn định hơn và (2) nhanh hơn nhiều. Tuy nhiên, tôi nghĩ đây sẽ là lần triển khai đầu tiên chúng tôi sẽ thử. Cảm ơn bạn. – Kariem

1

Tôi nghĩ bạn cũng có thể xuất bản dưới dạng dịch vụ web dựa trên SOAP. gSoap có thể được sử dụng để cung cấp giao diện dịch vụ ngoài thư viện. Bạn đã khám phá gSOAP chưa? Xem http://www.cs.fsu.edu/~engelen/soap.html

Kính trọng, Kangkan

2

Nếu bạn đang đi với các dịch vụ web, có lẽ Soaplab sẽ có ích. Về cơ bản nó là một công cụ để bọc các ứng dụng dòng lệnh hiện có trong các dịch vụ web SOAP. Các dịch vụ web mà nó tạo ra có vẻ hơi kỳ lạ nhưng nó là một cách phổ biến để làm một cái gì đó giống như công việc này.

0

Tôi đang làm một điều tương tự với C++ tại thời điểm này. Trong trường hợp của tôi, tôi đang viết một mô-đun PHP để cho phép các tập lệnh PHP truy cập vào logic trong thư viện C++ của tôi.

Sau đó tôi có thể sử dụng bất kỳ định dạng nào tôi muốn cho phép phần còn lại của thế giới nhìn thấy - ban đầu nó sẽ chỉ thông qua ứng dụng web PHP nhưng tôi cũng sẽ phát triển giao diện XML-RPC.

0

Nếu bạn đang đi xuống con đường JNI, hãy kiểm tra SWIG. http://www.swig.org/Doc1.3/Java.html

Giả sử bạn có tiêu đề để liên kết dự án với, swig khá dễ làm việc.

Các vấn đề liên quan