我有一個Linux服務器,需要將Perl庫發佈到.NET應用程序中。當然,我想我會構建一個獨立於平臺的解決方案,比如SOAP,以彌補差距。我發現這並不像我期待的那麼容易。構建由.NET使用的Perl SOAP服務
作爲一個迷你概念證明,我試圖在Perl中構建一個Hello World服務。我基於關閉此教程的生成我的代碼:
http://guide.soaplite.com/#quick%20start%20guide%20with%20soap%20and%20soap::lite
並穿插一些波德:: 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中,並認爲生活是偉大的。但事實並非如此。
當我嘗試envoke這樣的參考:
var myWS = new ServiceReference1.DemoHandlerClient(new System.ServiceModel.BasicHttpBinding(), new System.ServiceModel.EndpointAddress(url));
string result = myWS.hi();
我最終得到這個誤差出肥皂請求的:如果存在的話(
的SOAPAction應匹配「URI#方法」有 的 'http://本地主機/演示/ DemoHandler/hiRequest',預計 的 'http://本地主機/演示#喜'
Clearl我看到.NET沒有提交預期的SOAPAction。我能做些什麼來解決這個問題?我懷疑,如果我要爲客戶端使用perl SOAP :: Lite庫,這將工作正常。
編輯:或許怪異,但 - 如果我使用Fiddler捕獲.NET被髮送過XML,然後手動發送相同的XML在使用了SoapUI我最終得到有效的響應。
雖然XML內容是相同的,但不是請求,最可能的原因是SOAPAction HTTP標頭,嘗試*在Fiddler和soapUI中播放*。它也可以幫助你發佈你的WSDL文件(至少一個鏈接)。 – ArtM
是的,我發現SOAPAction沒有按照預期那樣做,並且弄錯了。接下來是錯誤「請求反序列化期間應用程序失敗:在第1行第0列,第-1字節在/usr/lib/perl5/XML/Parser.pm第187行沒有發現任何元素」 –