对WCF的PHP SOAP请求

对WCF的PHP SOAP请求,php,wcf,soap,Php,Wcf,Soap,我正在开发一个PHP程序来调用不允许直接访问WSDL的WCF Web服务。经过多次尝试和错误,我能够得到一个程序命中服务,但我从他们那里得到一个内部服务错误,他们说这是由于XML被错误地发送。我需要将XML数据作为字节数组发送给服务,我相信这就是我的问题所在。我不知道如何将字节数组绑定到soap调用。我可以找到几个创建字节数组的示例,但没有一个实际演示如何在请求中发送它们 <?php function AddWSSUsernameToken($client, $username, $p

我正在开发一个PHP程序来调用不允许直接访问WSDL的WCF Web服务。经过多次尝试和错误,我能够得到一个程序命中服务,但我从他们那里得到一个内部服务错误,他们说这是由于XML被错误地发送。我需要将XML数据作为字节数组发送给服务,我相信这就是我的问题所在。我不知道如何将字节数组绑定到soap调用。我可以找到几个创建字节数组的示例,但没有一个实际演示如何在请求中发送它们

<?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'));