2

.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を手動で送信すると、有効な応答が得られます。

4

1 に答える 1

3

SOAP::Liteは 2006 年に Web サービスを構築するために使用しましたが、悪魔が聖水を避けるように、それ以来避けてきた非常に悪い経験でした。本当に真剣に SOAP の道を歩もうとしているのであればXML::Compile、XML Schema、SOAP、および WSDL の一連のモジュールに精通することを強くお勧めします。私は、このモジュールの方がずっと使いやすいと感じました。メーリング リストがあり、作成者は非常に反応が良いです。

XML::Compile::SOAP::Daemonサーバーの構築方法については、 を参照してください。

于 2012-05-16T21:39:39.413 に答える