Ошибка Zend_Soap_Client при вызове веб-службы ASP.net: «... не задан экземпляр объекта» - PullRequest
2 голосов
/ 15 ноября 2010

Я пытаюсь использовать 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: ссылка на объект не установлена ​​для экземпляра объекта. в Service.UserDetails (UserDetail UserDetail)

некоторые поиски показали, что это довольно распространенная проблема. Казалось, что наиболее распространенным решением является передача параметров в виде массива, поэтому я попытался:

$result = $client->UserDetails(array('UserDetail' => $user));

но это дало ту же ошибку. Я также попытался передать params как объект stdClass, вложив массив в другой с параметром «params» в качестве ключа, и несколько других вещей, но ошибка всегда одинакова.

У меня есть ASP-код для самого веб-сервиса, соответствующий метод:

public Result UserDetails(UserDetail UserDetail) {

    [some stuff]

    Hashtable ht = new Hashtable();
    ht = UserDetail.GenerateData();
}

ошибка вызвана вызовом GenerateData ().

Я предполагаю, что метод UserDetails получает значение null вместо моего объекта в качестве параметра, но я не уверен, как мне следует вызывать метод или как я могу отлаживать это дальше. Кажется, что большинство примеров Zend_Soap_Client, которые я нашел, используют WSDL, которым не является этот сервис; не уверен, что это актуально. Любая помощь приветствуется!

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Я в конце концов решил это с помощью:

$userDetails = new UserDetails();
$userDetails->UserDetail = $user;

$client->UserDetails($userDetails);

кажется, что ASP.net ожидает (и возвращает) параметры, вложенные в объект / массив с тем же именем, что и вызываемый метод.

0 голосов
/ 15 ноября 2010

Если у вас есть возможность изменить код asp.net, я бы посоветовал вам попробовать реализовать метод UserDetails без параметров, просто чтобы убедиться, что код не нарушен.

Я бы тогда создалпотребительский метод в asp.net, отладьте http-запрос и посмотрите, как объект userdetail сериализуется / разбивается в виде массива.Тогда это просто вопрос создания аналогичного http-запроса от php.

...