在PHP中反序列化WCF Web服务请求

时间:2012-12-17 16:52:41

标签: php wcf soap service web

我有一个带有登录操作的WCF Web服务,它将公司名称,用户名和密码作为三个参数。我正在尝试创建一个PHP客户端应用程序来与此服务进行通信。无论我传递给Login操作,我都会收到以下错误:

OperationFormatter encountered an invalid Message body. Expected to find node type 'Element' with name 'Login' and namespace ''. Found node type 'Element' with name 'parameters' and namespace ''

我的客户端应用:

<?php
        try
        {
            $client = new SoapClient("https://somewhere.com/DataServiceRxPublic.svc?wsdl");

            //$params = array(
            //        'parameters' => array(
            //                'Param' => array(
            //                        array('Name' => 'loginCompany', 'Value' => 'XXX'),
            //                        array('Name' => 'loginId', 'Value' => 'XXX'),
            //                        array('Name' => 'loginPwd', 'Value' => 'XXX')
            //)));

            //$params = array(
            //        'Login' => array(
            //                array('Name' => 'loginCompany', 'Value' => 'XXX'),
            //                array('Name' => 'loginId', 'Value' => 'XXX'),
            //                array('Name' => 'loginPwd', 'Value' => 'XXX')
            //));

            //$params = array(
            //        'Login' => array(
            //                'parameters' => array(
            //                       array('Name' => 'loginCompany', 'Value' => 'XXX'),
            //                        array('Name' => 'loginId', 'Value' => 'XXX'),
            //                        array('Name' => 'loginPwd', 'Value' => 'XXX')
            //)));

            //$params = array(
            //        array('Name' => 'loginCompany', 'Value' => 'XXX'),
            //        array('Name' => 'loginId', 'Value' => 'XXX'),
            //        array('Name' => 'loginPwd', 'Value' => 'XXX')
            //);

            $params = array(
                    'loginCompany' => 'XXX',
                    'loginId' => 'XXX',
                    'loginPwd' => 'XXX'
            );

            $obj->loginCompany = 'XXX';
            $obj->loginId = 'XXX';
            $obj->loginPwd = 'XXX';

            //$result = $client->Login($obj);
            //$result = $client->Login($params);
        }
        catch (Exception $e)
        {
                print_r($e);
        }
    }
?>

$ params是不同的数组排列我在网上基于几个不同的例子。

感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

错误消息告诉您应该有一个名为“Login”的东西,但是被命名为“parameters”。

Go get SoapUI并使用您的WSDL按照我描述的here步骤来调试您实际发送的内容。如果您无法比较服务期望与发送的内容之间的差异,那将会出现过多的反复试验。

如果您需要更多外部帮助,我们需要WSDL资源 - 没有它,没有人知道预期的请求结构。

答案 1 :(得分:0)

结果我需要扩展SOAPClient并覆盖__doRequest()方法来替换不匹配的soap标头。

答案 2 :(得分:0)

我设法通过修改服务器端的服务命名空间来修复此错误。

or

命名空间之前是空的。