由于 SoapServer 类缺乏处理 SOAP 标头的能力,因此以下解决方法适合我的需求,因为我必须通过 SOAP 标头进行身份验证。
1. 使用一个处理 SOAP 请求的类,并让该类的构造函数接收发送的标头。
2. 在调用 SoapServer 之前,从传入的原始数据中提取 SOAP 标头。
3. 使用 setClass 时,将提取的标头传递给处理类。
在您的服务器脚本中执行以下操作:
<?php
$hdr = file_get_contents("php://input");
if (strpos($hdr,'<s:Header>')===false) {
$hdr = null;
} else {
$hdr = explode('<s:Header>',$hdr);
$hdr = explode('</s:Header>',$hdr[1]);
$hdr = $hdr[0];
}
$srv = new SoapServer('Your_wsdl');
$srv->setClass("ServiceClass",$hdr);
$srv->handle();
?>
服务类如下所示
<?php
class ServiceClass {
var $IsAuthenticated;
function __construct($hdr) {
$this->IsAuthenticated = false;
if ($hdr!=null) {
$this->header = simplexml_load_string($hdr);
}
}
function SomeFunctionOfTheService($a) {
if ($this->IsAuthenticated) {
}
}
}
?>