Zend_SOAP_CLIENT Ошибка вызова ASP.NET Веб -сервис: '… не установлен на экземпляр объекта'
-
10-10-2019 - |
Вопрос
Я пытаюсь использовать Zend_SOAP_CLIENT для связи с веб -службой ASP.NET. Вот мой клиент звонок:
$client = new Zend_Soap_Client(null, array(
'location' => 'http://example.com/service.asmx',
'uri' => 'http://example.com/'
));
$user = new UserDetail();
$result = $client->UserDetails($user);
Однако это всегда дает мне ошибку:
System.NullReferenceException: ссылка на объект не установлен на экземпляр объекта. at service.userdetails (userdetail userdetail)
Некоторые гугливы показали, что это довольно распространенная проблема. Казалось, наиболее распространенным решением было передавать параметры как массив, поэтому я попытался:
$result = $client->UserDetails(array('UserDetail' => $user));
Но это дало ту же ошибку. Я также попытался пропустить параметры как объект stdclass, гнездя массив в другом с «параметром» в качестве ключа, и несколько других вещей, но ошибка всегда одинакова.
У меня есть код ASP для самого веб -службы, соответствующий метод:
public Result UserDetails(UserDetail UserDetail) {
[some stuff]
Hashtable ht = new Hashtable();
ht = UserDetail.GenerateData();
}
Ошибка вызвана вызовом GeneratedATA ().
Я предполагаю, что метод userdetails становится нулевым вместо моего объекта в качестве параметра, но я не уверен, как я должен вызывать метод, или как я могу отлаживать это дальше. Большинство примеров Zend_SOAP_CLIENT, которые я обнаружил, кажется, используют WSDL, чего не является этой службой; Не уверен, что это актуально. Любая помощь оценена!
Решение
В конце концов я решил это:
$userDetails = new UserDetails();
$userDetails->UserDetail = $user;
$client->UserDetails($userDetails);
Кажется, ASP.NET ожидает (и возвращает) параметры будут вложены в объект/массив с тем же именем, что и вызываемый метод.
Другие советы
Если у вас есть возможность изменить код ASP.NET, я бы предложил вам попробовать реализацию метода userDetails без параметров, чтобы убедиться, что код не сломан.
Затем я бы создал потребительский метод в ASP.NET, отлаживал HTTP-Request и посмотрел, как userDetail-Object сериализован/разбит в форме массива. Тогда это «просто» вопрос создания аналогичного HTTP -запроса от PHP.