0

我正在构建一个基于 perl 的 SOAP 请求以发送到在 IIS 服务器上运行的 Web 服务。Web 服务接口将方法的参数定义为:

<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 定义。制作这种格式是微不足道的。但是,我总是得到错误:

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:dateTime”的“类型”,但我也尝试过“s:dateTime”和“dateTime”。一切都以同样的错误结束。

4

2 回答 2

1

我以前遇到过这个问题,最后我只是手动构建了 SOAP 请求。可能使用来自其他地方的工作请求。

或者,我看到了这个http://msdn.microsoft.com/en-us/library/ms995764.aspx,它详细说明了从 perl 连接到基于 .NET 的服务

这可能是相关位

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:string、s:startTime 和 s:endTime 以及 $startTime 和 $endTime 已设置。

您可以发布您尝试使用的服务吗?

于 2013-09-29T21:36:26.553 回答
0

叹息,我的坏。我打错了与日期相关的参数名称。这一切都有效。

于 2013-10-03T20:06:02.240 回答