2010-07-19 3 views
4

Я пытаюсь использовать .NET-сервис с использованием perl и SOAP Lite.Использование .Net Web-сервиса с использованием Perl и SOAP Lite

Когда я потребляю веб-службу на клиенте .Net - это должности в .asmx конечного следующее:

<?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> 

Как я могу генерировать тот же запрос с использованием SOAP-Lite? Я прошел через различные документы и статьи SOAP Lite без везения. До сих пор у меня есть следующие:

#!/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(); 

Это создает это, неправильный XML:

<?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> 

Update:

Когда я после 1-го XML моей службы с помощью скрипача он возвращает мой «Hello Мир ". Когда я отправляю второй, я получаю следующее:

<?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

Что случилось со вторым? Помимо дополнительного атрибута xsi: nil, они кажутся эквивалентными. –

+0

Не совсем уверен, обновленный вопрос с ошибкой, я возвращаюсь. – brendan

ответ

4

Обнаружена проблема - конечная косая черта в пространстве имен. .Net просто цифры, которые выкладывают для вас, но он должен быть явно установлен на Perl. Кроме того, выяснили, как нам использовать функцию ns() для добавления пространств имен.

Это приведет к созданию правильного XML.

#!/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(); 

Эта ссылка была очень полезна в выяснении SOAP :: Lite - http://kobesearch.cpan.org/htdocs/SOAP-Lite/SOAP/Lite.pm.html

+0

BTW, каноническая ссылка для любой документации модуля CPAN всегда 'http://search.cpan.org/perldoc? 'или просто перейдите на страницу http://search.cpan.org и введите имя модуля в поле поиска. Если вы на самом деле ленивы, просто зайдите в Google «cpan », и вы получите правильный результат в 99% случаев. – Ether

+0

очень круто, спасибо! - определенно не эксперт perl здесь – brendan

0

я должен был сделать следующее, чтобы заставить его работать (добавьте эту строку после моего $ мыло ... линия):

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

Я надеюсь, что это сэкономит кому-то какое-то время ... Потребовалось некоторое время, чтобы получить это выяснил ... :-)

BTW: Я использую .Net 4.5 WCF с сервисом окон для сервера веб-сервиса и P erl (activestate) V5.16.3 с SOAP :: Lite V 1.08.

Смежные вопросы