zend_soap_client错误调用ASP.NET Web服务:'…未设置为对象的实例'
-
10-10-2019 - |
题
我正在尝试使用zend_soap_client与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:对象引用未设置为对象的实例。在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();
}
该错误是由生成ata()调用引起的。
我假设UserDetails方法将其作为参数而不是我的对象,但是我不确定应该如何调用该方法,或者如何进一步调试该方法。我发现的大多数zend_soap_client示例似乎都在使用WSDL,此服务不是。不确定这是否相关。任何帮助!
解决方案
我最终通过:
$userDetails = new UserDetails();
$userDetails->UserDetail = $user;
$client->UserDetails($userDetails);
似乎ASP.NET期望(和返回)参数嵌套在对象/数组中,其名称与所调用的方法相同。
其他提示
如果您有可能更改ASP.NET代码的可能性,我建议您尝试实现无参数的方法,只是为了确保代码不会损坏。
然后,我将在ASP.NET中创建一个消费者方法,调试HTTP-RequeSt,并查看如何以阵列形式序列化/分解UserDetail-Object。然后,这是“仅”从PHP创建类似的HTTP请求的问题。
不隶属于 StackOverflow