2010-02-15 4 views
0

C'est une situation assez étrange que j'ai ici. J'ai utilisé un morceau de code pour interagir avec un service SOAP backend pendant plusieurs mois - ça marche bien. Je l'ai essayé dans un projet différent (d'abord comme une bibliothèque de swc et puis juste en coupant et en collant) et cela ne fonctionne tout simplement pas.Pourquoi la même requête SOAP fonctionnerait-elle dans un projet Flex et pas dans un autre?

Si je tente exactement le même code dans le projet flex d'origine, la connexion au même service back-end, tout fonctionne très bien. Dans le nouveau projet, je peux appeler des opérations qui prennent des wrappers littéraux simples comme params (ils n'ont pas de paramètres réels) - mais si l'opération a un paramètre complexe dans l'enveloppe littérale du document - échouer sur ce nouveau projet. Voici un exemple qui échouerait:

var service:WebService = new WebService(); 
service.wsdl = wsdlURL; 
var operation:AbstractOperation = service.getOperation("addNewUser"); 

var param:XML = <AddNewUserRequest/> 
param.setNamespace(myNameSpace); 

param.user.username(username); 
param.user.email(email); 

operation.send(param); 

Et est un échantillon ici qui fonctionnerait dans le nouveau projet:

var service:WebService = new WebService(); 
service.wsdl = wsdlURL; 
var operation:AbstractOperation = service.getOperation("getUsers"); 

var param:XML = <GetUsersRequest/> 
param.setNamespace(myNameSpace); 

operation.send(param); 

Voici quelques choses que je l'ai fait pour essayer une piste celui-ci vers le bas :

-Examiné les messages dans firebug des deux projets et ne peut pas voir une différence (ce qui signifie que le code semble générer exactement la même demande SOAP dans les deux projets (comme on s'attend) -J'ai vérifié que les demandes travailler en utilisant SOAPui pour interroger directement le service Web

Le service de back-end est un webservice Apache CXF et voici un échantillon de l'erreur qu'il génère:

org.apache.cxf.interceptor.Fault: élément trouvé {} http://www.w3.org/2001/XMLSchema utilisateur mais n'a pas pu trouver correspondant à RPC/partie littérales

Tout ce que je sais me porte à croire que l'utilisateur doit être dans l'espace de noms http://www.w3.org/2001/XMLSchema - et honnêtement - je crois que la clé ici est que le code fonctionne dans un projet, mais pas dans le autre. Pourrait-il être un paramètre XML? L'un des statiques comme ignoreWhitespace? J'ai joué avec changer ceux autour - sans chance.

Des idées du tout? Ça me rend fou!!!

MISE À JOUR:

Je l'ai réduit à ceci: le nouveau projet crée un en-tête comme ceci:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

et celui qui fonctionne crée ceci:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

Pourquoi la différence sur la même version exacte de flex constructeur &? Celui qui fonctionne est évidemment correct (xmlns: xsd = "http://www.w3.org/2001/XMLSchema") - le service Web est correct pour rejeter une demande qui met tout dans la demande dans l'espace de noms xsd.

Répondre

2

La raison pour laquelle il est l'ajout xmlns="http://www.w3.org/2001/XMLSchema" à l'enveloppe SOAP au lieu de xmlns:xsd="http://www.w3.org/2001/XMLSchema" est parce que c'est la façon dont il est défini dans la classe rpc.xml.SchemaConstants. À un certain moment dans le projet rompu, vous avez importé un xsd dans la classe rpc.xml.SchemaManager qui définit xmlns="http://www.w3.org/2001/XMLSchema", qui remplace la définition par défaut dans SchemaConstants.

Essayez de vérifier tous les xsds que vous utilisez et assurez-vous qu'ils ne contiennent pas xmlns="http://www.w3.org/2001/XMLSchema".

+1

Vous êtes évidemment un programmeur ninja extrêmement sage et puissant - vos compétences sont fortes et votre puissance est illimitée. Je vais jouer au fltron - qui est le seul à penser que le flex est bon pour ça;) –

1

Vous inscrivant votre demande en XML, et je suppose que votre espace de noms personnalisé ne dispose pas d'un préfixe, il est en conflit avec l'espace de noms par défaut pour XSD déclaré dans votre tête. Pourquoi vous obtenez des en-têtes différents que je ne connais pas, mais vous compilez probablement votre projet avec différentes versions du SDK.

Quelques choses à essayer:

  • Assurez-vous que vous utilisez le SDK de saké pour compiler les deux projets (la dernière que vous pouvez sortir avec, comme corrections de bugs à la pile SOAP passent dans presque chaque nouvelle version)

  • Définir un préfixe explicite pour votre espace de noms, en utilisant:

    var myNameSpace:NameSpace = new NameSpace("my","http://something.com/foo/ns");

  • INSTE annonce de la construction d'une requête XML, construire comme des objets AS3 simples, comme ceci:

    var request:Object = {GetUsersRequest: {parm1: foo, parm2:bar }};

    ... et laissez Flex faire pour vous tout le codage. Tout un tas de personnes (y compris moi-même) ont mis d'innombrables heures à faire fonctionner correctement la pile Flex SOAP avec des objets AS3 au lieu de requêtes XML manuelles, pourquoi ne pas laisser le SDK faire le travail de construction de votre requête?

Questions connexes