2013-09-27 73 views
0

我正在構建基於perl的SOAP請求,以發送到在IIS服務器上運行的Web服務。 Web服務接口定義的參數的方法爲:SOAP :: Lite和dateTime值

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <MyMethodName xmlns="http://third.party.Web.Service/"> 
     <thing1>string</thing1> 
     <StartTime>dateTime</StartTime> 
     <EndTime>dateTime</EndTime> 
    </MyMethodName> 
    </soap:Body> 
</soap:Envelope> 

WSDL定義插件:

<s:element name="MyMethodName "> 
    <s:complexType> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="thing1" type="s:string"/> 
      <s:element minOccurs="1" maxOccurs="1" name="StartDate" type="s:dateTime"/> 
      <s:element minOccurs="1" maxOccurs="1" name="EndDate" type="s:dateTime"/> 
     </s:sequence> 
    </s:complexType> 
</s:element> 

格式化日期字符串不是一個很難的事情。我正在從數據庫中提取值,我很容易看到dateTime definition。制定這種格式是微不足道的。然而,我總是得到錯誤:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM. 

我的搜索顯示的帖子說,以確保日期字符串格式正確。我手工編寫了字符串,並依靠兩個SOAP :: Lite相關的幫助模塊來處理dateTime格式。

的我當前的代碼相關的位包括:

use SOAP::Lite; 
use SOAP::DateTime qw(ConvertDate); 

$soapResult = $soap->MyMethodName(
    SOAP::Data->type('string')->name('thing1')->value("my thing"), 
    SOAP::Data->type('xsd:dateTime')->name('StartDate')->value(ConvertDate($row->{Start})), 
    SOAP::Data->type('xsd:dateTime')->name('EndDate')->value(ConvertDate($row->{End}))); 

我目前正在一個「類型」的「XSD:日期時間」,但我ahve還試圖「S:日期時間」和「日期時間」。一切都以相同的錯誤結束。

+1

您是否嘗試過轉動追蹤以查看實際發送的內容?使用SOAP :: Lite + trace =>'all'; – KeepCalmAndCarryOn

+0

我沒有嘗試添加追蹤,但我現在有。值都看起來正確。他們都是這種形式: 2013-08-22T15:54:28 這正是我在第一個地方輸入的內容。 –

回答

1

我以前遇到過麻煩,最後我只是手工構建SOAP請求。可能使用其他地方的工作請求。

另外我看到這個http://msdn.microsoft.com/en-us/library/ms995764.aspx哪些細節連接到一個基於.NET服務在Perl

這可能是相關的位

use SOAP::Lite; 

my $soap = SOAP::Lite 
    -> uri('http://third.party.Web.Service/') 
    -> on_action(sub { join '/', 'http://third.party.Web.Service', $_[1] }) 
    -> proxy('ttp://third.party.Web.Service/<YOUR SERVICE HERE>.asmx'); 

my $method = SOAP::Data->name('MyMethodName') 
    ->attr({xmlns => 'http://www.alfredbr.com/'}); 

my @params = (SOAP::Data->name('s:string' => 'my thing'), 
      SOAP::Data->name('s:startTime' => $startTime), 
      SOAP::Data->name('s:endTime' => $endTime)); 

print $soap->call($method => @params)->result; 

在您的參數是S:字符串,S:開始時間和s :endTime和$ startTime和$ endTime已被設置。

你可能會發布你試圖消費的服務嗎?

+0

有趣。我會在早上嘗試「強制」數據類型。我正在做你的代碼示例建議的一切。 由於合同問題,我無法公開服務。 –

0

感嘆,我的壞。我錯誤地輸入了與日期相關的參數名稱。這一切都有效。