4

perlとSOAPLiteを使用して.NetWebサービスを利用しようとしています。

.NetクライアントでWebサービスを使用すると、.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を使用して同じリクエストを生成するにはどうすればよいですか?私はさまざまなSOAPLiteのドキュメントや記事を読んできましたが、運がありませんでした。これまでのところ、私は次のものを持っています:

#!/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>

アップデート:

fiddlerを使用して最初のxmlをサービスに投稿すると、「HelloWorld」の結果が返されます。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>
4

2 に答える 2

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

于 2010-07-19T21:17:41.017 に答える
0

私はそれを機能させるために次のことをしなければなりませんでした(私の$ soap ...行の後にこの行を追加してください):

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

これが誰かの時間を節約することを願っています...それを理解するのに時間がかかりました...:-)

ところで:私はWebサービスサーバー用のWindowsサービスで.Net 4.5 WCFを使用し、SOAP :: Lite V 1.08でPerl(activestate)V5.16.3を使用しています。

于 2014-01-07T19:52:19.353 に答える