PHP Soap客户端和.NET Web服务

时间:2011-09-06 16:05:33

标签: php .net web-services soap

大家好我试图用PHP使用SoapClient消费.NET,但是当我的php客户端发送请求时我得到了以下问题,.NET WS没有得到正确格式的请求xml我的代码我希望有一个帮助我,谢谢ind建议

class login {
    public $User;
    public $Password;
}

$logr = new login;

$logr->User = 'user';
$logr->Password = 'pass';


try {
    $client = new soapclient ("http://..../Service.asmx?WSDL", array('classmap' => array('LoginRequest' => 'login'),));


    print_r($logr);
    $client -> Login ($logr);

}
catch (Exception $e) {
    echo "Error!<br />";
    echo $e -> getMessage ();
}

当我在.net应用程序上测试我的.net网络服务器时,我发送了这个,并且效果很好

<soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2011/XMLScheme">
    <soap:Body>
        <Login
            xmlns="http://tempuri.org">
            <LoginRequest>
                <User>user</User>
                <Password>pass</Password>
            </LoginRequest>
        </Login
    </soap:Body>
</soap:Envelope>

但是当我在php上测试时我得到了这个,而且这个错误服务器无法处理请求。 ---&GT;对象引用未设置为对象的实例。

<SOAP-ENV:Envelope
        xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope"
        xmlns:ns1="http://tempuri.org"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        <SOAP-ENV:Body>
            <Login
                xmlns="http://tempuri.com"
                xso:type="ns1:LoginRequest">
                    <User>user</User>
                    <Password>pass</Password>
            </Login>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

4 个答案:

答案 0 :(得分:1)

class LoginRequest {
    public $User;
    public $Password;

    public function __construct($usr, $pwd) {
         $this->User = $usr;
         $this->Password = $pwd;
    }
}

$login = new LoginRequest('user', 'password');

$client = new SoapClient('http://..../services.asmx?wsdl');
$client->login($login); // try 1
$client->login(array('LoginRequest' => $login)); //try 2

答案 1 :(得分:0)

要使用.Net Web服务,使用NetBeans IDE,添加“服务”并指向.net Web服务(确保将WSDL放在最后),然后从'service'中拖放'工具箱到php文件,它为你编写代码:)

也很棒。

[我不能说你的代码有什么问题]

答案 2 :(得分:0)

我最近在帮助客户使用我们的.Net网络服务时遇到了这个问题,所以我想我会分享以防其他人在将来遇到这个问题。

感谢adudly提供有助于阐明问题的指导。您必须为数组中的参数提供名称,并注意该名称区分大小写。

工作代码

try {
    $wsdl_url = 'http://<mywebserver>/LeadWs.svc?wsdl';
    $client = new SOAPClient($wsdl_url);

    $params = array(
        'lead' => ""
    );
    $return = $client->Insert2($params);

    print_r($return);
} catch (Exception $e) {
    echo "Exception occurred: " . $e;
}

我失败的尝试使用首都'L'代表Lead。这显然是WSDLs / XSD中唯一默认为小写的东西。如果仔细搜索WSDL / XSD,您将看到方法所需的任何参数的确切名称。一旦你做到了这些,SoapClient将处理剩余的XML编码。

我的最终代码如下:

try {
    $wsdl_url = 'http://<mywebserver>/LeadWs.svc?wsdl';
    $client = new SOAPClient($wsdl_url);

    $lead = new Lead(); // Could just be an array as well
                        // but I created a class to help the user
    $lead->FirstName = "Tester";
    $lead->LastName = "Test";
    $lead->ZipCode = "00000";
    $lead->NumberOfTVs = 2;

    $params = array('lead' => $lead);
    $return = $client->Insert2($params);

    print_r($return);
} catch (Exception $e) {
    echo "Exception occurred: " . $e;
}

希望将来帮助某人。

答案 3 :(得分:-1)

您可以使用SoapHeader和setSoapHeaders here