2010-07-19 14 views
4

J'essaie de consommer un service Web .Net en utilisant perl et SOAP Lite.Consommation du service Web .Net en utilisant Perl et SOAP Lite

Quand je consomme le service Web dans un client .Net - il affiche à l'extrémité .asmx les éléments suivants:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:tns="http://mysoapnamespace.com/" 
xmlns:types="http://mysoapnamespace.com/encodedTypes"> 
    <soap:Body> 
    <tns:HellowWorld /> 
    </soap:Body> 
</soap:Envelope> 

Comment puis-je générer cette même demande en utilisant SOAP Lite? J'ai traversé une variété de docs SOAP Lite et d'articles sans succès. Jusqu'à présent, je donne les résultats suivants:

#!/usr/bin/perl 
use SOAP::Lite 'trace', 'debug' ; 

$api_ns = "https://mysoapnamespace.com"; 
$api_url = "http://mysoapnamespace/api.asmx"; 
$action = "HelloWorld"; 

    my $soap = SOAP::Lite 
    -> readable(1) 
    -> uri($api_ns) 
    -> proxy($api_url) 
    -> on_action(sub { return "\"$action\"" }) ; 


return $soap->HellowWorld(); 

Cela génère cela, XML incorrect:

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <HellowWorld xmlns="http://mysoapnamespace.com" xsi:nil="true" /> 
     </soap:Body> 
</soap:Envelope> 

Mise à jour:

Quand je posterai le 1er xml à mon service à l'aide Fiddler il retourne mon « Bonjour Monde "résultat. Lorsque je poste le 2ème, je reçois ce qui suit:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>System.Web.Services.Protocols.SoapException: Server was unable to read request. ---&gt; System.InvalidOperationException: There is an error in XML document (9, 6). ---&gt; System.InvalidOperationException: &lt;HellowWorld xmlns='http://mysoapnamespace.com'&gt; was not expected. 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read21_HellowWorld() 
    at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer28.Deserialize(XmlSerializationReader reader) 
    at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 
    --- End of inner exception stack trace --- 
    at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 
    at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) 
    at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters() 
    --- End of inner exception stack trace --- 
    at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters() 
    at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()</faultstring><detail /></soap:Fault></soap:Body></soap:Envelope> 
+0

Quel est le problème avec le second? En dehors de l'attribut supplémentaire xsi: nil, ils semblent équivalents. –

+0

Pas vraiment sûr, question mise à jour avec l'erreur que je suis de retour. – brendan

Répondre

4

Trouvé le problème - la barre oblique de fin sur l'espace de noms. .Net ne fait que chiffrer ce que vous voulez, mais il doit être défini explicitement en Perl. Aussi, compris comment nous la fonction ns() pour ajouter des espaces de noms.

Cela générera le code XML correct.

#!/usr/bin/perl 
use SOAP::Lite 'trace', 'debug' ; 

$api_ns = "https://mysoapnamespace.com/"; 
$api_url = "http://mysoapnamespace/api.asmx"; 
$action = "HelloWorld"; 

    my $soap = SOAP::Lite 
    -> readable(1) 
    -> ns($api_types,'types') 
    -> ns($api_ns,'tns') 
    -> proxy($api_url) 
    -> on_action(sub { return "\"$action\"" }) ; 


return $soap->HellowWorld(); 

Ce lien a été très utile pour déterminer SOAP :: Lite - http://kobesearch.cpan.org/htdocs/SOAP-Lite/SOAP/Lite.pm.html

+0

BTW, le lien canonique pour la documentation du module CPAN est toujours 'http://search.cpan.org/perldoc? ', ou allez simplement sur http://search.cpan.org et tapez le nom du module dans le champ de recherche. Si vous êtes vraiment * paresseux, il suffit de google "cpan " et vous obtiendrez le bon résultat 99% du temps. – Ether

+0

très cool, merci! - Certainement pas un expert Perl ici – brendan

0

je devais faire ce qui suit pour le faire fonctionner (ajouter cette ligne après mon savon $ ... en ligne):

$soap->ns('http://schemas.xmlsoap.org/soap/envelope/',"s"); 

J'espère que cela sauvera quelqu'un un peu de temps ... il a fallu un certain temps pour l'obtenir a compris ... :-)

BTW: J'utilise .Net 4.5 WCF avec un service de fenêtres pour le serveur de service Web et P erl (activestate) V5.16.3 avec SOAP :: Lite V 1.08.