2017-07-16 2 views
0

J'ai deux fichiers WSDL et j'ai utilisé gSOAP pour créer du code C++.gSOAP - En-tête SOAP-Action non défini

Pour générer le code, les commandes suivantes ont été utilisées:

\path\to\wsdl2h -I \path\to\import\dir -j -N Service1Prefix -n Namespace1Prefix -o \path\to\output\header\dir\header1.h -q CPPNamespace1 -t \path\to\typemap.dat .\path\to\wsdl1.wsdl 

Et ainsi de suite pour les fichiers WSDL restants. Dans la documentation gsoap, j'ai lu qu'un fichier env.h vide serait nécessaire pour gérer la sérialisation et la gestion des erreurs. J'ai donc créé un fichier vide pour cela.

Après cela, je généré le code C++ pour chacun des fichiers WSDL avec l'outil soap2cpp:

\path\to\soap2cpp -1 -C -L -a -A -b -d \path\to\output\dir -i -j -I \path\to\import\dir -n -r -w -x \path\to\header\dir\header1.h 

Et le env.h

\path\to\soap2cpp -1 -C -L -b -d \path\to\output\dir -j -I \path\to\import\dir -penv -r -w -x \path\to\env.h 

Tout a fonctionné et j'obtenu le code C++.

Je l'ai mis dans mon code et essayé une méthode, mais une erreur est survenue.

Error: WSWS3147E: Error: no SOAPAction header!

J'ai essayé un peu de jongler avec les paramètres de wsdl2h et soap2cpp, mais ne sont pas venus à un résultat satisfaisant. Lorsque je supprime le paramètre pour les préfixes, l'en-tête SOAPAction a été défini, mais j'obtiens des problèmes lorsque la réponse contient des objets avec le même nom mais un contenu différent.

Certaines recherches n'ont pas mis en place une solution de travail pour moi. Est-ce que quelqu'un d'entre vous pourrait avoir déjà fait face à ce problème et pourrait vous aider?

Répondre

0

Il se peut que WSDL ne définisse pas l'en-tête Action SOAP dans l'attribut wsdl: liaison/wsdl: opération/soap: opération/@ soapAction, bien que cela soit peu probable. Cependant, si tel est le cas ou si soapAction n'est pas correctement spécifié dans le WSDL et que vous connaissez l'en-tête SOAP Action, vous pouvez simplement définir manuellement l'en-tête SOAP Action lors de l'appel du service:

// create a service proxy object 
SomeProxy proxy; 
// invoke the service at an endpoint URL and SOAP Action, pass parameters: 
if (proxy.someMethod("endpoint URL", "soap action", ...) == SOAP_OK) 
    ... // got the results! 

Ceci définit l'en-tête HTTP SOAP Action sur la chaîne fournie comme second paramètre. Vous pouvez utiliser NULL pour le point de terminaison et/ou les chaînes d'action pour permettre à l'appel d'utiliser le point de terminaison et l'action définis par WSDL à la place.

PS # 1. utilisez uniquement l'option soapcpp2 -j (de préférence) ou -i, mais n'utilisez pas les deux.

PS # 2. Pourquoi ne pas lancer wsdl2h sur tous les WSDL combinés? Cela économise une quantité substantielle de code généré à la fin. Les classes de proxy de service sont de toute façon générées séparément pour les services dans les WSDL avec soapcpp2 lorsque les services sont combinés dans un gros fichier .h. De cette façon, vous êtes également certain que les en-têtes SOAP et les fautes SOAP fonctionnent correctement. Explication: env.h doit définir tous les en-têtes SOAP et toutes les structures de détail SOAP Fault extraites des fichiers .h générés séparément, ce qui peut être fastidieux à effectuer manuellement.

+0

Chaque méthode de chaque WSDL contient un attribut soapAction. – MBU

+0

La version 2.8.47 de gSOAP a été utilisée. Je vais essayer 2.8.49. La combinaison de tous les fichiers WSDL en un gros fichier d'en-tête nous a posé problème. Imaginez une position. Dans un WSDL, une position contient l'adresse municipale, la ville et ainsi de suite. dans un second document WSDL a Position contient la latitude, la longitude et l'horodatage d'un objet en mouvement. wsdl2h conserve uniquement la première occurrence de cet objet de position. – MBU

+0

Vous dites que vos WSDL n'ont pas d'espace de noms unique, ce qui entraîne des conflits de noms? C'est un très mauvais design. Voilà ce que sont les espaces de noms. Heureux d'entendre qu'il existe un moyen de contourner cela. –