对WCF的PHP SOAP请求
我正在开发一个PHP程序来调用不允许直接访问WSDL的WCF Web服务。经过多次尝试和错误,我能够得到一个程序命中服务,但我从他们那里得到一个内部服务错误,他们说这是由于XML被错误地发送。我需要将XML数据作为字节数组发送给服务,我相信这就是我的问题所在。我不知道如何将字节数组绑定到soap调用。我可以找到几个创建字节数组的示例,但没有一个实际演示如何在请求中发送它们对WCF的PHP SOAP请求,php,wcf,soap,Php,Wcf,Soap,我正在开发一个PHP程序来调用不允许直接访问WSDL的WCF Web服务。经过多次尝试和错误,我能够得到一个程序命中服务,但我从他们那里得到一个内部服务错误,他们说这是由于XML被错误地发送。我需要将XML数据作为字节数组发送给服务,我相信这就是我的问题所在。我不知道如何将字节数组绑定到soap调用。我可以找到几个创建字节数组的示例,但没有一个实际演示如何在请求中发送它们 <?php function AddWSSUsernameToken($client, $username, $p
<?php
function AddWSSUsernameToken($client, $username, $password)
{
$wssNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
$username = new SoapVar($username,
XSD_STRING,
null, null,
'Username',
$wssNamespace);
$password = new SoapVar($password,
XSD_STRING,
null, null,
'Password',
$wssNamespace);
$usernameToken = new SoapVar(array($username, $password),
SOAP_ENC_OBJECT,
null, null, 'UsernameToken',
$wssNamespace);
$usernameToken = new SoapVar(array($usernameToken),
SOAP_ENC_OBJECT,
null, null, null,
$wssNamespace);
$actionHeader[] = new SoapHeader($wssNamespace, 'Security', $usernameToken);
$client->__setSoapHeaders($actionHeader);
}
$UserName = "SENDUSER";
$Password = strtoupper(sha1("asefesgsg23##@"));
$IncData = file_get_contents('/path/to/xml');
$data = array();
$data1 = unpack('C*', $IncData);//base64_encode($IncData);
foreach($data1 as $ByteVal)
{
array_push($data,$ByteVal);
}
define('NEWLINE', "<br />\n"); // Constant for new line
$wsdl = 'https://urltopostservice'; //wsdl address of wcf service wsdl Definition
$uri = "http://tempuri.org";
$options = [
'location' => $wsdl,
'uri' => $uri,
'trace' => true,
'exceptions' => 0,
'encoding'=>'ISO-8859-1',
'cache_wsdl' => WSDL_CACHE_NONE,
'soap_version' => SOAP_1_1
];
$svc = 'UploadService';
$func = 'UploadN';
try{
$client = new SoapClient(null, $options);
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
AddWSSUsernameToken($client, $UserName, $Password);
try {
$result = $client->__soapCall('UploadN', array(new SoapParam(new SoapVar($data, SOAP_ENC_OBJECT),
'data')),array("soapaction" => 'http://tempuri.org/IUploadService/UploadN'));
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
print_r($result);
} catch (SoapFault $exception) {
// Catch an exception.
echo "Fault code: {$exception->faultcode}" . NEWLINE; // echo the Fault code
echo "Fault string: {$exception->faultstring}" . NEWLINE; // echo the fault string describing the
exception that occurred
}
?>
将$data转换为字符串后,我尝试:
$result = $client->__soapCall('UploadN', array(new SoapParam(new SoapVar($data, XSD_STRING),
'data')),array("soapaction" => 'http://tempuri.org/IUploadService/UploadN'));
这只是自己尝试非数组值
$result = $client->__soapCall('UploadN', array($data1,array("soapaction" =>
'http://tempuri.org/IUploadService/UploadN'));
$result = $client->__soapCall('UploadN', array($data1,array("soapaction" =>
'http://tempuri.org/IUploadService/UploadN'));