Использование веб-службы .Net с использованием Perl и SOAP Lite

Я пытаюсь использовать веб-службу .Net с помощью 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>

Обновлять:

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

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

person brendan    schedule 19.07.2010    source источник
comment
Что не так со вторым? За исключением дополнительного атрибута xsi: nil, они кажутся эквивалентными.   -  person Grant McLean    schedule 20.07.2010
comment
Не совсем уверен, обновленный вопрос с ошибкой, которую я возвращаю.   -  person brendan    schedule 20.07.2010


Ответы (2)


Обнаружил проблему - косая черта в конце пространства имен. .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

person brendan    schedule 19.07.2010
comment
Кстати, каноническая ссылка на документацию по любому модулю CPAN всегда http://search.cpan.org/perldoc?<module name>, или просто перейдите на search.cpan.org и введите название модуля в поле поиска. Если вы очень ленивы, просто погуглите cpan ‹modulename›, и вы получите правильный результат в 99% случаев. - person Ether; 20.07.2010

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

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

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

Кстати: я использую .Net 4.5 WCF со службой Windows для сервера веб-служб и Perl (activestate) V5.16.3 с SOAP :: Lite V 1.08.

person Stephen L. De Rudder    schedule 07.01.2014