Mehrere gSOAP Services in einer Anwendung
-
Hallo,
ich benutze gSOAP momentan noch zu Testzwecken, und stehe vor dem Problem, das ich mehrere Webservices in einem Programm verwenden möchte.
Ich habe die soap Source Files für C++ erstellt.
Momentan läuft es bei mir so ab:
[...] MyTestService service; service.run(8080); [...]Sollte jetzt ein Request ankommen, wird er automatisch angenommen und die passende Methode ausgeführt.
Mein Problem ist jetzt aber, wie mache ich es am besten, wenn ich mehrere Services habe?
[...] MyTestService1 service1; service1.run(8080); MyTestService2 service2; service2.run(8080); [...]Es nimmt sich immer die erste Instanz des Requests an, und falls die Methode nicht existiert, die aufgerufen werden soll, wird ein Fehler zurück gegeben.
Laut gSOAP Dokumentation könnte ich mit einer copy Funktion arbeiten, welche den Request von Instanz zu Instanz kopiert, bis eine trifft. Das will ich aber nicht, ich möchte nicht Alles durchprobieren.
Gibt es einen effizienteren weg, event. indem ich von dem ankommenden Request irgendwie die Methode herausbekomme, die aufgerufen werden soll, oder ein anderes Identifikationsmerkmal? Event. eine ID oder einen Hash oder dgl.?
Oder wie macht man sowas in der Praxis sonst? Bin ich event. komplett auf dem falschen Weg?
Außerdem, wie handhabe ich das mit den soap Services und Threads? Die Beispiele in der Doku laufen alle auf die C-Variante hinaus, nicht aber auf C++!
Bitte um Hilfe und/oder Infos.
Danke!
Mfg Mani
-
Das sieht so aus als würdest du zwei Services parallel auf dem selben Port horchen lassen. Halt ich für ungünstig, da du dann entweder nicht wissen kannst, welcher der beiden einen ankommenden Request annimmt, oder immer der selbe den Request nimmt und der andere völlig umsonst ins leere horcht.
Ich würde einen einzelnen Service draus machen, der je nachdem was im Request steht, die Bearbeitung verschiedenen Routinen übergibt.
-
Hi,
danke für deine Antwort!
pumuckl schrieb:
Das sieht so aus als würdest du zwei Services parallel auf dem selben Port horchen lassen.
Ja genau, es horchen mind. 2 Services auf dem selben Port.
pumuckl schrieb:
Halt ich für ungünstig, da du dann entweder nicht wissen kannst, welcher der beiden einen ankommenden Request annimmt, oder immer der selbe den Request nimmt und der andere völlig umsonst ins leere horcht.
Das ist das oben von mir beschriebene Verhalten.
pumuckl schrieb:
Ich würde einen einzelnen Service draus machen, der je nachdem was im Request steht, die Bearbeitung verschiedenen Routinen übergibt.
Der momentan vorhandene Service macht das ja, alles selbständig! Nur wird das Programm so gestaltet werden, das mehrere Services existieren und zwar als library, die dann eingebunden werden.
Ich suche nun eine Möglichkeit, die ankommenden Requests irgendwie zu unterscheiden, damit ich die Requestbehandlung an das entsprechende Objekt weitergeben kann. Z.b. so:
if(service == "getInfo1()") { TestService1 ts1; ts1.serve(); } else if(service == "getInfo2()") { TestService2 ts2; ts2.serve(); } [...]
-
[quote="Steini79"]Der momentan vorhandene Service macht das ja, alles selbständig! Nur wird das Programm so gestaltet werden, das mehrere Services existieren und zwar als library, die dann eingebunden werden.[quote]
Also wenn ich das richtig verstehe hast du aktuell einen Service, der die Requests an die richtigen "Bearbeiter"-Routinen verteilt, die keine Services sind? Warum willst du die Situation dann verschlechtern, indem du in deiner Library (oder sinds mehrerer Libs?) mehrere Services draus machst?
Ne Alternative wäre doch, aus den "Bearbeitern" Libs zu machen und dem Service dann zu sagen, welche "Bearbeiter" er aktivieren soll. Dann bleibst du immernoch bei einem einzelnen Service, der nichts anderes macht, als die Requests an die Bearbeiter zu verteilen oder eben einen Fehler auszgeben, wenn der entsprechende Bearbeiter nicht freigeschaltet ist bzw. nicht existiert.
Je nachdem was du erreichen willst kann der Nutzer deiner Lib auch selber Bearbeiter schreiben, die er an dem Verteiler-Service registrieren kann. Und/Oder bei bestimmten Requests werden die Libs mit dem passenden Bearbeiter nachgeladen und eingebunden, auch wenn sie ursprünglich nicht freigeschaltet waren.Mein Fazit ist, dass du nur einen wirklichen Service brauchst, der am Port lauscht. Alles andere kann dahinter geregelt werden. Mehrere Services auf dem gleichen Port funktionieren ja offenbar nicht.
Ich suche nun eine Möglichkeit, die ankommenden Requests irgendwie zu unterscheiden, damit ich die Requestbehandlung an das entsprechende Objekt weitergeben kann.
Ich dachte das macht dein vorhandener Service schon alles?
-
pumuckl schrieb:
Also wenn ich das richtig verstehe hast du aktuell einen Service, der die Requests an die richtigen "Bearbeiter"-Routinen verteilt, [...]
Nicht ganz, das wäre dann der soll zustand!

Anders ausgedrückt, ich möchte Reques-Anahme und Request-Be/Verarbeitung trennen. Das wäre kein Problem, ich verwende dazu die Methode auf der Serverseite und verteile den Input.
Ich glaube ich werde die gSOAP Doku noch etwas studieren.
Ich glaube ich werde um folgendes nicht herum kommen:
soapABCService abc; soapUVWService uvw; soapXYZService xyz; ... abc.bind(NULL, 8080, 100); ... abc.accept(); ... if (abc.serve() == SOAP_NO_METHOD) { soap_copy_stream(&uvw, &abc); if (uvw.dispatch() == SOAP_NO_METHOD) { soap_copy_stream(&xyz, &uvw); if (xyz.dispatch()) xyz.soap_stream_fault(std::cerr); xyz.destroy(); } else uvw.soap_stream_fault(std::cerr); uvw.destroy(); } else abc.soap_stream_fault(std::cerr); abc.destroy(); ...Aber danke für die diskussion, das hat mich schließlich darauf gebracht!
-
Hallo Steini79,
hat das damit funktioniert?
Gruß dbo