.NET アプリケーションに公開する必要がある Perl ライブラリを備えた Linux サーバーがあります。当然のことながら、SOAP のようなプラットフォームに依存しないソリューションを構築して、ギャップを埋めようと考えました。これは私が期待していたほど簡単ではないことがわかりました。
ちょっとした概念実証として、Perl で Hello World サービスを構築しようとしています。このチュートリアルに基づいてコードを生成しました。
http://guide.soaplite.com/#quick%20start%20guide%20with%20soap%20and%20soap::lite
そして、私がここで見つけたいくつかの Pod::SOAP コメントにちりばめられました: http://www.perlmonks.org/?node_id=632923
そして、このサービスに行き着きました:
#!/usr/bin/perl
use CGI;
use SOAP::Transport::HTTP;
SOAP::Transport::HTTP::CGI->dispatch_to('Demo')-> handle;
package Demo;
=begin WSDL
_RETURN $string
=end WSDL
=cut
sub hi {
return "hello, world";
}
このスクリプトで WSDL を生成しました。
#!#!/usr/bin/perl
use Pod::WSDL;
my $pod = new Pod::WSDL(source => '/var/www/html/perl/test.pl', location => 'http://localhost/perl/test.pl', pretty => 1, withDocumentation =>1);
print $pod->WSDL;
このスクリプトを実行すると、WSDL が取得されます。私はそれを ServiceReference として .NET 4.0 にロードし、人生は素晴らしいと思います。しかし、そうではありません。
次のように参照を呼び出そうとすると:
var myWS = new ServiceReference1.DemoHandlerClient(new System.ServiceModel.BasicHttpBinding(), new System.ServiceModel.EndpointAddress(url));
string result = myWS.hi();
SOAPリクエストからこのエラーが発生します。
SOAPAction は、存在する場合は「uri#method」と一致する必要があります (「http://localhost/Demo/DemoHandler/hiRequest」を取得し、「http://localhost/Demo#hi」が必要です)
明らかに、.NET が予期された SOAPAction を送信していないことがわかります。これを修正するにはどうすればよいですか? クライアントに perl SOAP::Lite ライブラリを使用する場合、これで問題なく動作すると思います。
編集:おそらくもっと奇妙です.Fiddlerを使用して.NETが送信しているXMLをキャプチャし、SoapUIを使用して同じXMLを手動で送信すると、有効な応答が得られます。