代码之家  ›  专栏  ›  技术社区  ›  Tim Fountain

Zend_Soap_客户端调用ASP.net web服务时出错:“…未设置为对象的实例”

  •  2
  • Tim Fountain  · 技术社区  · 14 年前

    我正在尝试使用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(用户详细信息用户详细信息)

    一些google显示这是一个很常见的问题。最常见的解决方案似乎是将参数作为数组传递,因此我尝试:

    $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,而这个服务并不是;不确定这是否相关。感谢任何帮助!

    2 回复  |  直到 14 年前
        1
  •  2
  •   Tim Fountain    14 年前

    我最终解决了这个问题:

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

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

        2
  •  0
  •   Toft    14 年前

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

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

    推荐文章