构建由.NET消耗的Perl Soap服务

时间:2012-05-16 19:13:06

标签: .net perl soap wsdl service-reference

我有一个带有Perl库的Linux服务器,我需要向.NET应用程序公开。当然,我认为我会构建一个独立于平台的解决方案,如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();

我最终从肥皂请求中得到了这个错误:

  

SOAPAction应匹配'uri#method'(如果存在)(得到   'http:// localhost / Demo / DemoHandler / hiRequest',预计   的 'http://本地主机/演示#喜'

显然,我发现.NET没有提交预期的SOAPAction。我该怎么做才能解决这个问题?我怀疑如果我要为客户端使用perl SOAP :: Lite库,那么这样可以正常工作。

编辑:也许更奇怪 - 如果我使用Fiddler来捕获.NET发送的XML,然后使用SoapUI手动发送相同的XML,我最终得到一个有效的响应。

1 个答案:

答案 0 :(得分:3)

我在2006年使用SOAP::Lite建立了一个网络服务,这是一个非常糟糕的经历,我已经避免过,因为魔鬼避免了圣水。如果您确实非常认真地走上了SOAP之路,那么我非常建议您熟悉XML Schema,SOAP和WSDL的XML::Compile模块套件。我发现该模块更好用,并且有一个邮件列表,作者非常敏感。

查看XML::Compile::SOAP::Daemon以了解如何构建服务器。