我正在尝试使用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请求的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top