目前我正在使用WSHttpBinding的WCF服务。到目前为止,该服务适用于.NET应用程序。但是,当在PHP中使用此服务时,它会抛出一个错误。导致该错误是因为PHP将null作为参数发送给WCF服务。
服务合同如下:
[ServiceContract]
public interface IWebsite : IWcfSvc
{
[OperationContract]
[FaultContract(typeof(ServiceException))]
ResponseResult LostPassword(RequestLostPassword request);
}
用于参数的数据协定如下所示:
[DataContract]
public class RequestLostPassword
{
[DataMember(IsRequired = true)]
public string Email { get; set; }
[DataMember(IsRequired = true)]
public string NewPassword { get; set; }
[DataMember(IsRequired = true)]
public string CardNumber { get; set; }
[DataMember(IsRequired = true)]
public DateTime RequestStart { get; set; }
}
由于我不是专家,我花了一段时间才能使PHP代码正常工作,但我最终编写了一个这样的脚本:
$parameters = array(
'Email' => "user@test.com",
'NewPassword' => "test",
'CardNumber' => "1234567890",
'RequestStart' => date('c')
);
$svc = 'Website';
$port = '10007';
$func = 'LostPassword';
$url = 'http://xxx.xxx.xxx.xxx:'.$port.'/'.$svc;
$client = @new SoapClient(
$url."?wsdl",
array(
'soap_version' => SOAP_1_2,
'encoding'=>'ISO-8859-1',
'exceptions' => true,
'trace' => true,
'connection_timeout' => 120
)
);
$actionHeader[] = new SoapHeader(
'http://www.w3.org/2005/08/addressing',
'Action',
'http://tempuri.org/I'.$svc.'/'.$func,
true
);
$actionHeader[] = new SoapHeader(
'http://www.w3.org/2005/08/addressing',
'To',
$url,
true
);
$client->__setSoapHeaders($actionHeader);
$result = $client->__soapCall($func, array('parameters' => $parameters));
我不明白为什么它没有将参数传递给WCF服务。我有另一项服务工作得很好,虽然不需要参数。有人可以解释为什么会这样吗?我是一个完整的PHP菜鸟,只是希望将其作为开发网站的人的一个例子。
答案 0 :(得分:1)
我们找到了答案! 下面的代码行:
$result = $client->__soapCall($func, array('parameters' => $parameters));
应改为:
$result = $client->__soapCall($func, array('parameters' => array('request' => $parameters)));
显然你需要告诉PHP你的参数嵌套在一个名为'request'的数组中,当你想要一个带有datacontract作为请求对象的WCF服务时,它嵌套在一个名为parameters的数组中。