Zend_Soap_Client错误调用ASP.net Web服务:'...未设置为对象的实例'

时间:2010-11-15 12:50:06

标签: php zend-framework soap zend-soap

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

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

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

2 个答案:

答案 0 :(得分:2)

我最终解决了这个问题:

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

$client->UserDetails($userDetails);

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

答案 1 :(得分:0)

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

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