美好的一天。
我希望使用PHP的Message Security与WCF Web服务集成。 Web服务需要来自客户端的证书(PHP代码),并且不需要任何用户名或密码。它还使用wsHttpBinding。 我有一台运行IIS7的Windows x64个人电脑,我可以从我的浏览器执行php代码。
我尝试在PHP中使用SoapClient(),代码如下:
<?php
ini_set("soap.wsdl_cache_enabled", "0");
try
{
$context = stream_context_create(["ssl" => ["local_cert" => "./cert/TestClient.pem", "CN_Name => CN=TestClient"]]);
$options = ["soap_version" => SOAP_1_2, "authentication" => SOAP_AUTHENTICATION_DIGEST, "context" => $context];
$service = new SoapClient("http://vanzyld:49321/pointerws/?wsdl", $options);
$service->GetVehicleList([3538]);
}
catch (SOAPFault $f)
{
error_log('ERROR => '.$f);
}
?>
但是,
使用SOAP_1_2,这是从调用返回的错误:
ERROR => SoapFault exception: [HTTP] Error Fetching http headers in C:\inetpub\phproot\WebService\GetVehicles.php:16
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://vanzyld:...', 'http://pointers...', 2, 0)
#1 C:\inetpub\phproot\WebService\GetVehicles.php(16): SoapClient->__call('GetVehicleList', Array)
#2 {main}
使用SOAP_1_1,会返回此内容。
ERROR => SoapFault exception: [HTTP] Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'application/soap+xml; charset=utf-8'. in C:\inetpub\phproot\WebService\GetVehicles.php:16
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://vanzyld:...', 'http://pointers...', 1, 0)
#1 C:\inetpub\phproot\WebService\GetVehicles.php(16): SoapClient->__call('GetVehicleList', Array)
#2 {main}
经过大量研究后,看起来SoapClient不会处理对实现Message Security的WCF Web服务的调用。 其中一个建议是(从这里:How to communicate between PHP and WCF securely)我从WSO2安装了第三方软件包,但这似乎也不是最好的方法,因为WSO2不再支持这个了。即使按照如何在我的电脑上安装wsf的所有步骤,我也无法在我的电脑上安装WSF。 (https://wso2.com/project/wsf/php/2.0.0/docs/install_guide.html - 我遵循了步骤2.1和2.4)WSF部分从未在我的phpinfo页面上弹出启用。安装WSF后返回的PHP错误,只是代码无法找到WSClient()类。
是否有任何其他PHP类或库或第三方对象可用于将PHP代码与使用Message Security的WCF Web服务成功集成?或者SoapClient()是否有办法实际使用这种WCF服务?或者,PHP是否仅限于与Message Security WCF Web服务集成的能力?
谢谢。 Daleen
答案 0 :(得分:0)
在这两种情况下,您的标头似乎都有错误。您被明确告知SOAP_1_2错误,SOAP_1_1错误会抱怨设置的内容类型错误,这意味着实际上内容类型标题没有正确发送。
尝试使用SoapHeader
类修复代码: