2008-09-05 12 views
11

Bir JAVA web uygulamasına bağlanması gereken bir C++ uygulamasına sahibim, bunun için iyi, açık kaynaklı bir SOAP paketi var mı, yoksa sadece kendi başıma dönmeyi kolaylaştırır mı?C++ ve SOAP

cevap

1

Hızlı bir Google, bir araç seti için this'u açtı. Ben hiç kullanmadım, oldukça popüler ve sağlam görünüyor. Tam olarak bir paket değil, gerçekten kendi başınıza yuvarlanmıyor, ama ortada bir çeşit.

0

Apache'nin Axis projesine bir göz atın. C++ (ve Java) üzerinde iyi bir şekilde desteklenir ve hedef hizmet için iyi bir WSDL ile başlamak için iyi bir servete sahipseniz, evden çıkmış olursunuz.

11

gSoap'dan bu yana karanlığa oy vereceğim. Çoğunlukla bir Java mağazasıydık ama bazı C++ bitleri ve gSoap ile tercih edilen SOAP entegrasyon yolu. Tipik Java yığınlarından gerçekten daha fazla çalışmak ama sağlam görünüyor.

1

Sadece C++ projesi için JRE ve Axis'e bağımlı olmaktan kaçınmak için Axis yerine gSOAP ile gittik. Tamam çalıştı, hangi gSOAP kodu korkunç ve iyi herhangi bir hata düzeltmek için çok zorlaştırır beri iyidir.

gSOAP bağlantısıyla ilgili bir uyarı olsa da: tek bir bağlantı nesnesinde (yürütülebilir, dll, paylaşılan nesne) birden fazla WSDL kullanamazsınız. Bunun nedeni, üretilen WSDL'ye özgü bazı işlevlerin genel adlarına sahip olmasıdır (ör. Soap_getfault()).

Daha da kötüsü, Unix ELF bağlantısıyla, bu adlar paylaşılan nesneler arasında çapraz bağlantıya neden olacaktır, bu nedenle bir FooService hatası, arıza ayrıntıları yapıları farklıysa belleği bozarak, BarService için soap_getfault() tarafından işlenebilir.

Bunun için geçici çözüm, gSOAP ile ilgili hiçbir şeyin bağlı olmayan SO'nın dışında kalmamasına dikkat etmektir. Bu kodunuzu gSOAP kütüphaneye kendini bağlarken bu tanımlar _both gcc veren ve bağlayarak çözülebilir:

#define SOAP_FMAC2 __attribute__ ((visibility ("hidden"))) 
#define SOAP_FMAC4 __attribute__ ((visibility ("hidden"))) 
#define SOAP_FMAC6 __attribute__ ((visibility ("hidden"))) 
#define SOAP_NMAC __attribute__ ((visibility ("hidden"))) 

ben bir başlık dosyasına koyarak ve dahil etmek gcc zorlayarak bunu çözdüğünü -include fixsoaplink.h ile her şeyden önce.

Çabaları elinize alarak daha iyi bir yol, varsayılan ELF görünürlüğünü gizli olarak değiştirebilir ve yalnızca istediğiniz sembolleri (VC'de dllimport/dllexport gibi) dışa aktarabilir.

+1

Huh. Aslında, oluşturulan tüm kodu bir isim alanının arkasına koymak konusunda gSOAP’ta güzel şeyler gördüm. Aslında neredeyse pozitifim. Bu, soap_getfault() gibi genel ad işlevlerinin, tek bir bağlantı nesnesinde bile çarpışmayacağı anlamına gelir. –

+1

Aslında tek bir bağlantı nesnesine birden fazla wsdl koyabilirsiniz, şu anda bunu yapıyorum! – fido

0

Oluşturulan kodu gSOAP'tan gördüğümde, kalp krizi geçirdim.

Kullanıcının her nesne için tüm bellek yönetimini yapması gerekmesi gerçeği aklımdan çıkardı. Yani, oturdum ve uzun vadede muhtemelen aptalca bir şey yaptı, ama kısa vadede oldukça tatmin edici bir şey yaptı ...

GSOAP kodunu, arayüzün daha çok benzeyen kendi CPP sınıflarımla saran bir program yazdım. Bakmasını isterim.

Her hizmet yönteminde Kapsamlı Muhafızlar'ı bellekte tutmak için kullandım ve her çeşit farklı türde çalıştığım için bunu yapmak için std::list<boost::any> kullandım. İhtiyacım olan her nesne türünü yaratan işlevlerim var ve bunlar gerçek belleği list<any> benim içine koydu. Birkaç sorun vardı - çoğunlukla sadece yapılandırma değişiklikleri. Şimdi binlerce ders üretiyorum, düzinelerce web servisiyle konuşuyorum.

Eminim aynı yolu başka birine tavsiye ederim ...Muhtemelen mermiyi ısırmalı ve gSOAP'a katkıda bulunmaya çalışmak yerine gSOAP'a katkıda bulunmaya çalışmalıyım. Bu, gSOAP'ın çıkışına bağlı olan kendi aracımı korumaktan daha fazlası ...

+0

Benzer bir şey yaptım, sonra ne kadar aptal ve ne kadar sürdürebilir olduğunu fark ettim. Kodu yeniden kodladıktan sonra, oluşturulan herhangi bir gSOAP C++ sınıfı için çalışabilecek şablonlu bir sınıfım vardı. Eğer istersen sana kodu gönderebilirim. – fido

+0

Bunu takdir ediyorum! - [email protected] veya belki google kodunda veya benzer bir şey gönderebilirsiniz. :-) –

0

İşte gSOAP ile ilgili başka bir sorun da, zor yolu keşfettik:() Tüm yoklama için, 1024 dosya tanımlayıcınız açıldıktan sonra (64 Windows'da mı?) yığının çöpe atılması. Bu, uygulamanın gönderilememesi için iletileri gönderemediği hatalı hatalarla sonuçlanır. Eğer gSOAP kendisi yama hazırlamış sürece

geçici çözüm, kendi ağ kodunu yazıp ile sabun-> fconnect bunu kanca olduğunu, -> fsend, -> frecv vb