2010-07-05 7 views
0

J'ai un problème lorsque j'essaie de récupérer des informations via une méthode web. J'utilise un proxy pour appeler un service web, dans ce proxy j'ai une opération qui retourne des données en utilisant les paramètres 'out'.Services Web ASP.NET utilisant des paramètres de référence dans webmethod

Le serveur exécute l'opération avec succès, en redonnant les paramètres correctement instanciés (j'ai aussi vérifié le message retour de savon en utilisant un analyseur de trafic et ça va), mais quand je demande ces paramètres au proxy, valeurs.

Voici quelques informations de code:

// Ceci est l'appel au service Web en utilisant le proxy (t est le proxy et get_capabilities est le webmethod)

public trf_capabilities get_capabilities() { 
      trf_capabilities trfcap = new trf_capabilities();     
      trfcap.protocol_list= t.get_capabilities(0, out trfcap.pause, out trfcap.maxfiles, out trfcap.maxsize, out trfcap.encrypt, out trfcap.authenticate, out trfcap.integritycheck, out trfcap.hashtype, out trfcap.multipath, out trfcap.profile_list);    
      return trfcap; 
     } 

// Ceci est la WEBMETHOD définition

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("iTransfer-get_capabilities",/*RequestElementName="elementoVacio_",*/ RequestNamespace="", ResponseElementName="trf_capabilitiesPar", ResponseNamespace="", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] 
     [return: System.Xml.Serialization.XmlElementAttribute("protocol_list", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public protocolType[] get_capabilities([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] int vacio, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool pause, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out uint maxfiles, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out uint maxsize, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool encrypt, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool authenticate, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool integritycheck, [System.Xml.Serialization.XmlElementAttribute("hash_type", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out hash_typeType[] hash_type, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool multipath, [System.Xml.Serialization.XmlElementAttribute("profile_list", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out profile_listType[] profile_list) { 
      object[] results = this.Invoke("get_capabilities", new object[] { 
         vacio}); 
      pause = ((bool)(results[1])); 
      maxfiles = ((uint)(results[2])); 
      maxsize = ((uint)(results[3])); 
      encrypt = ((bool)(results[4])); 
      authenticate = ((bool)(results[5])); 
      integritycheck = ((bool)(results[6])); 
      hash_type = ((hash_typeType[])(results[7])); 
      multipath = ((bool)(results[8])); 
      profile_list = ((profile_listType[])(results[9])); 
      return ((protocolType[])(results[0])); 
     } 

Comme vous pouvez le voir, je suis en utilisant le jeton « out » dans la méthode d'appel et gestionnaire, mais il semble ne suffit pas pour obtenir le comportement correct.

Et enfin, voici le message SOAP intercepté avec l'analyseur de trafic:

Content-Type: text/xml; charset=UTF-8 
Server: SOAPStandaloneServer 
Content-Length: 584 
Connection: close 

<E:Envelope xmlns:E="http://schemas.xmlsoap.org/soap/envelope/" xmlns:A="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.w3.org/2001/XMLSchema"><E:Body><ns1:get_capabilitiesResponse xmlns:ns1=""><ns1:pause>true</ns1:pause><ns1:maxfiles>5</ns1:maxfiles><ns1:maxsize>0</ns1:maxsize><ns1:encrypt>true</ns1:encrypt><ns1:authenticate>true</ns1:authenticate><ns1:integritycheck>true</ns1:integritycheck><ns1:multipath>true</ns1:multipath></ns1:get_capabilitiesResponse></E:Body></E:Envelope> 

Toutes les idées?

+0

Je viens de faire un test avec un autre webservice en utilisant les paramètres 'out' pour transmettre des données et fonctionne correctement. Mon pari va à la sérialisation xml et [décoration]. Je ne sais pas quoi d'autre peut être. – Francisco

+0

Un autre point à considérer est que je ne suis pas en mesure d'obtenir même les valeurs de retour de la méthode web correctement instanciée. – Francisco

Répondre

1

Je pense que vous êtes sur la bonne voie avec [décoration] et la sérialisation des réponses. les tableaux là-dedans semblent un peu compliqués, avez-vous des routines de sérialisation pour les éléments qui s'y trouvent?

Encore une fois, avoir cette quantité de paramètres de sortie semble un peu écrasante. J'aurais probablement créé une structure "ServiceResponse" et ajouté tous les params en tant que propriétés.

EDIT: La prochaine étape, si la réponse semble correcte mais que le proxy a des problèmes de désérialisation, je suggérerais (bien sûr) de plonger plus profondément dans le proxy. Le proxy est-il généré ou l'avez-vous écrit manuellement? Essayez de le parcourir et de voir ce qu'il essaie de faire avec les paramètres qui lui ont été donnés. Souvent, je bidouille avec des services Web jusqu'à ce que mes yeux saignent, seulement pour découvrir que la spécification de désérialisation était obsolète.

+0

Merci pour votre commentaire. Je suis vraiment d'accord avec votre proposition, mais je crains qu'il n'y ait pas grand chose à voir avec la structure des données de la procuration. Ils m'ont donné ça de cette façon, alors je dois y faire aussi bien que possible. Depuis que j'ai testé avec succès les modificateurs 'out' avec un autre service web (écrit complètement en C#), je pense qu'il doit y avoir quelque chose à voir avec les standards et la sérialisation. BTW: le serveur de service Web est écrit en C++. – Francisco

0

J'ai trouvé quelque chose d'intéressant à propos de tout cela. J'ai vérifié les en-têtes des deux types de méthodes web que j'ai (celui écrit en C++ que je dois utiliser et celui que j'ai développé en C#). J'ai réalisé que, pour les paramètres sortants, .NET ajoutait une sorte d'emballage. vient ici l'explication msdn:

La partie XML de la réponse SOAP encapsule les sur paramètres de la méthode de service Web, y compris le résultat dans un élément. Par défaut, le nom de l'élément d'encapsulation est le nom de la méthode de service Web auquel Response est ajouté.

Here is the link

Il semble que vous devez utiliser cet emballage afin d'obtenir « des » paramètres de référence de travail.

+0

Pas de chance. Les deux en-têtes ont la même [décoration] à l'exception de certaines requeriments Namespaces qui ne pensent pas causer les problèmes. ..deadend .. – Francisco

+0

Eh bien, je l'ai fait fonctionner en utilisant des commentaires à "ResponseElementName" – Francisco

Questions connexes