Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend#u Soap#u客户端调用ASP.net web服务时出错:';。。。未设置为对象的实例';_Php_Zend Framework_Soap_Zend Soap - Fatal编程技术网

Php Zend#u Soap#u客户端调用ASP.net web服务时出错:';。。。未设置为对象的实例';

Php Zend#u Soap#u客户端调用ASP.net web服务时出错:';。。。未设置为对象的实例';,php,zend-framework,soap,zend-soap,Php,Zend Framework,Soap,Zend Soap,我正在尝试使用Zend_Soap_客户端与ASP.net web服务通信。这是我的客户电话: $client = new Zend_Soap_Client(null, array( 'location' => 'http://example.com/service.asmx', 'uri' => 'http://example.com/' )); $user = new UserDetail(); $result = $client->UserDetails(

我正在尝试使用Zend_Soap_客户端与ASP.net web服务通信。这是我的客户电话:

$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));
但这也产生了同样的错误。我还尝试将params作为stdClass对象传递,将数组嵌套在另一个数组中,并使用“params”作为键,以及其他一些东西,但错误总是一样的

我有web服务本身的ASP代码,相关方法是:

public Result UserDetails(UserDetail UserDetail) {

    [some stuff]

    Hashtable ht = new Hashtable();
    ht = UserDetail.GenerateData();
}
该错误是由GenerateData()调用引起的


我假设UserDetails方法得到的是null,而不是我的对象作为参数,但是我不确定应该如何调用该方法,或者如何进一步调试它。我发现的大多数Zend_Soap_客户机示例似乎都在使用WSDL,而此服务并不是;不确定这是否相关。感谢您的帮助

如果您有可能更改asp.net代码,我建议您尝试不带参数的UserDetails方法的实现,以确保代码不会被破坏


然后,我将在asp.net中创建一个使用者方法,调试http请求,并查看userdetail对象是如何以数组形式序列化/分解的。然后“只是”从php创建一个类似的http请求。

我最终通过以下方法解决了这个问题:

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

$client->UserDetails($userDetails);

ASP.net似乎希望(并返回)参数嵌套在与所调用方法同名的对象/数组中。

我知道ASP代码在web服务处于活动状态且正在使用时起作用。我希望避免创建自己的.NET客户端来调试它,因为我没有一个ASP DEV环境,所以我会考虑我最后的选择!