2

我正在尝试使用 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));

但这给出了同样的错误。我还尝试将参数作为 stdClass 对象传递,将数组嵌套在另一个以“参数”为键的数组中,以及其他一些东西,但错误总是相同的。

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

public Result UserDetails(UserDetail UserDetail) {

    [some stuff]

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

该错误是由 GenerateData() 调用引起的。

我假设 UserDetails 方法正在获取 null 而不是我的对象作为参数,但我不确定我应该如何调用该方法,或者如何进一步调试它。我发现的大多数 Zend_Soap_Client 示例似乎都在使用 WSDL,而这个服务不是。不确定这是否相关。任何帮助表示赞赏!

4

2 回答 2

2

我最终解决了这个问题:

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

$client->UserDetails($userDetails);

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

于 2010-11-17T20:27:52.710 回答
0

如果您有任何可能更改 asp.net 代码,我建议您尝试执行不带参数的 UserDetails 方法,以确保代码没有损坏。

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

于 2010-11-15T13:07:24.690 回答