使用SoapHeader()调用将.NET语法转换为PHP

时间:2009-07-16 22:34:33

标签: .net php soap soapheader

我需要使用SoapHeader()调用将此.NET语法转换为PHP。

esb.RequestServerVersionValue = new RequestServerVersion(); esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1;

非常感谢! :)

2 个答案:

答案 0 :(得分:1)

$soapHeader = new SoapHeader(
                     'http://schemas.microsoft.com/exchange/services/2006/types',
                     'RequestServerVersion Version="Exchange2007_SP1"'
                     );

$客户端 - > __ setSoapHeaders($ SOAPHEADER);

这基本上都是真正需要设置的。我对命名空间设置感到困惑。奇怪的是,使用公用文件夹时需要RequestServerVersion标头,但在Exchange 2007中使用邮箱项时似乎不需要。

此链接特别有用:http://www.zimbra.com/forums/developers/5532-php-soap-vs-zimbra.html因为它向我展示了如何启用调试并清楚地说明了每个属性的作用。

此Google搜索结果显示生成此代码所需的有效XML“t:RequestServerVersion”

答案 1 :(得分:0)

在使用SoapHeader类时,我个人从未设法按照我想要的方式获取标题。为了更灵活,您应该考虑自定义SoapClient类。正如我在another question中回答的那样,您可以在覆盖SoapClient::__doRequest()时根据需要构建SOAP消息。这样你就可以随意插入XML片段。

class My_SoapClient extends SoapClient
{
    protected function __doRequest($request, $location, $action, $version) 
    {
        /*
         * $request is a XML string representation of the SOAP request
         * that can e.g. be loaded into a DomDocument to make it modifiable.
         */
        $domRequest = new DOMDocument();
        $domRequest->loadXML($request);

        // modify XML using the DOM API, e.g. get the <s:Header>-tag 
        // and add your custom headers
        $xp = new DOMXPath($domRequest);
        $xp->registerNamespace('s', 'http://www.w3.org/2003/05/soap-envelope');
        $headers = $xp->query('/s:Envelope/s:Header');
        if ($headers->length == 0) {
            $envelope = $xp->query('/s:Envelope')->item(0);
            $header = $domRequest->createElementNS('http://www.w3.org/2003/05/soap-envelope', 's:Header');
            $envelope->appendChild($header);
        } else {
            $header = $headers->item(0);
        }

        // now add your custom header
        $requestServerVersion = $domRequest->createElementNS('T_NAMSPACE', 't:RequestServerVersion');
        $requestServerVersion->setAttribute('Version', 'Exchange2007_SP1');

        $header->appendChild($requestServerVersion);

        $request = $domRequest->saveXML();
        return parent::__doRequest($request, $location, $action, $version);
    }
}
必须将

T_NAMSPACE更改为前缀t的正确名称空间。