0

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

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 是我基于几个不同的在线示例的不同数组排列。

任何帮助表示赞赏。

4

3 回答 3

0

错误消息告诉您应该有一些名为“登录”的东西,但被命名为“参数”。

获取SoapUI并使用您的 WSDL 按照我在此处描述的步骤来调试您实际发送的内容。如果您无法比较服务期望的内容与您发送的内容,那么这将是太多的反复试验。

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

于 2012-12-17T23:34:08.640 回答
0

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

于 2012-12-18T23:16:06.990 回答
0

我设法通过修改服务器端的服务命名空间来解决这个错误。

[ServiceContract(Name="Service", Namespace = "https://sample.eu")]

命名空间之前是空的。

于 2016-08-23T12:13:12.707 回答