2012-05-16 35 views
2

我有一個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我最終得到有效的響應。

+0

雖然XML內容是相同的,但不是請求,最可能的原因是SOAPAction HTTP標頭,嘗試*在Fiddler和soapUI中播放*。它也可以幫助你發佈你的WSDL文件(至少一個鏈接)。 – ArtM

+0

是的,我發現SOAPAction沒有按照預期那樣做,並且弄錯了。接下來是錯誤「請求反序列化期間應用程序失敗:在第1行第0列,第-1字節在/usr/lib/perl5/XML/Parser.pm第187行沒有發現任何元素」 –

回答

3

我在2006年使用SOAP::Lite來構建一個web服務,這是一個很糟糕的經歷,我從此避免了像魔鬼一樣避免聖水。如果你確實走上了SOAP的道路,那麼我會非常建議熟悉XML::Compile XML Schema,SOAP和WSDL模塊套件。我發現這個模塊更好用,並且有一個郵件列表,作者的響應速度非常快。

看看XML::Compile::SOAP::Daemon瞭解如何構建服務器。

+0

我會查看並取回給你。你有什麼好的例子好用嗎? –

+0

最終我認爲你是對的,儘管我認爲XML :: Compile更像是一隻野獸,而不是我正在尋找的東西。我打算構建一些簡單的基於rest的cgi腳本來返回XML。然而,有一些WSDL可以工作,這本來是很不錯的。我用它作爲構建一個簡單的REST腳本的參考:http://www.lifecycle-ps.com/blog/?p=93 –