在使用 WCF 服务 .net 作为服务器和 PHP-soap 作为客户端时,您需要严格遵循指南。PHP-soap 的文档不足以调试,也不是很清楚。PHP nusoap 在文档方面略胜一筹,但在示例方面仍然不够,对于初学者来说不是一个很好的选择。nusoap 有一些示例,但大多数都不起作用。我建议以下调试清单:
- 检查 web.config 文件中的绑定。对于 PHP,它必须是“<strong>basicHttpBinding”
- PHP,$client->__soapCall()函数将所有参数作为数组发送,因此如果您的 Web 服务函数需要将输入参数作为数组,那么参数必须在一个额外的数组中。下面给出了示例#3 来清除。
- 如果需要,则将“<strong>array('soap_version' => SOAP_1_1)”或“<strong>array('soap_version' => SOAP_1_2)”传递给 SoapClient() 对象以显式声明肥皂版本。
- 始终尝试向 SoapClient 对象声明“array("trace" => 1)”以读取请求和响应字符串。
- 使用“<strong>__getLastResponse();” 读取响应字符串的函数。
- 使用“<strong>__getLastRequest();” 读取请求字符串的函数。
重要提示:如果您为作为参数传递的任何值返回 NULL,请检查您的 .cs(.net) 文件,该文件如下所示:
[ServiceContract]
public interface IDynamicWCFService
{
[OperationContract]
string HelloYesterday(string test);
}
此处传递的变量名,必须与您在 PHP 中调用时匹配。对于下面的示例,我将其视为“测试”。
示例#1:使用带有单个参数的 php-soap 来处理 HelloYesterday 函数
<?php
$url="http://99-mxl9461k9f:6062/DynamicWCFService.svc?WSDL";
$client = new SoapClient($url, array( "trace" => 1 ));
$result = $client->HelloYesterday(array('test' => 'this is a string'));
var_dump($result);
$respXML = $client->__getLastResponse();
$requXML = $client->__getLastRequest();
echo "Request: <br>";
var_dump($requXML);
echo "Response: <br>";
var_dump($respXML);
?>
示例 #2:使用带有单个参数的 nusoap 用于 HelloYesterday 函数
<?php
require_once('../lib/nusoap.php');
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$url="http://99-mxl9461k9f:6062/DynamicWCFService.svc?WSDL";
$client = new nusoap_client($url, 'wsdl', $proxyhost, $proxyport, $proxyusername, $proxypassword); $client->soap_defencoding = 'UTF-8'; // this is only if you get error of soap encoding mismatch.
$err = $client->getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
// Doc/lit parameters get wrapped
$param = array('test' => ' This is a string for nusoap');
$result = $client->call('HelloYesterday', array('parameters' => $param), '', '', false, true);
// Check for a fault
if ($client->fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $client->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>
再举一个例子……将数组作为参数传递或传递混合类型参数,然后检查以下示例:
示例#3:将包含数组参数的混合类型参数传递给 Soap 函数。.net 操作文件示例
[ServiceContract]
public interface IDynamicWCFService
{
[OperationContract]
string[] HelloYesterday (string[] testA, string testB, int testC );
}
PHP 代码
<?php
$url="http://99-mxl9461k9f:6062/DynamicWCFService.svc?WSDL";
$client = new SoapClient($url, array( "trace" => 1 ));
$params = array(
"testA" => array(0=>"Value1",1=>"Value2",2=>"Value3"),
"testB" => “this is string abc”,
"testC" =>123
); // consider the first parameter is an array, and other parameters are string & int type.
$result = $client->GetData($params);
var_dump($result);
$respXML = $client->__getLastResponse();
$requXML = $client->__getLastRequest();
echo "Request: <br>";
var_dump($requXML);
echo "Response: <br>";
var_dump($respXML);
?>
希望上面的例子会有所帮助。