В настоящее время я работаю над службой WCF, которая использует WSHttpBinding. Пока что сервис отлично работает с приложениями .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' => "[email protected]",
'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 и просто хочу, чтобы это работало как пример для парня, который разрабатывает сайт.
Мы нашли ответ!
Строка кода ниже:
$result = $client->__soapCall($func, array('parameters' => $parameters));
Должен быть изменен на:
$result = $client->__soapCall($func, array('parameters' => array('request' => $parameters)));
Очевидно, вам нужно сообщить PHP, что ваши параметры вложены в массив, называемый «запрос», который вложен в массив, называемый параметрами, когда вы хотите вызвать службу WCF с datacontract в качестве объекта запроса.
Других решений пока нет …