PHP SoapClient连接到.NET Web服务

时间:2014-09-12 22:29:10

标签: php web-services soap

我在创建从PHP应用程序到.NET Web服务的连接时遇到了一些麻烦。我已经在很多网站上阅读了该做什么,但我似乎无法使其发挥作用。

Web服务需要用户名和密码,而我所要做的就是通过发送用户ID来获取用户数据管理系统中的一些用户配置文件数据。

这是提供者所说的SOAP请求应该是这样的:

POST /feed30/clientdataservice.asmx HTTP/1.1
Host: ws-ic-pilot.acme.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "GetUser"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetUser xmlns="urn:Acme:ClientDataService">
  <strUserId>string</strUserId>
</GetUser>
</soap:Body>
</soap:Envelope>

以下是根据我在互联网上各种网站上发现的代码编写的代码:

$client = new SoapClient('https://ws-ic-pilot.acme.com/feed30/clientdataservice.asmx
WSDL',Array("trace" => 1));
$header = new SoapHeader(
    array(
            'UserName' => 'myusername',
            'Password' => 'mypassword',
            'strUserID' => '12345'
    ) );

$client->__setSoapHeaders($header);

$client->GetUser();

当我使用__getLastRequestHeaders和__getLastRequest时,我正在创建的SOAP消息如下所示:

POST /feed30/clientdataservice.asmx HTTP/1.1
Host: ws-pilot.acme.com
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.21
Content-Type: text/xml; charset=utf-8
SOAPAction: "GetUser"
Content-Length: 247

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="urn:Acme:ClientDataService"><SOAP-ENV:Header/>
<SOAP-ENV:Body><ns1:GetUser/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

当我将SOAP消息发布到.NET服务器时,我收到以下响应:

<ExceptionInfo>Exception Message:       Security requirements are not satisfied because the  
security header is not present in the incoming message.;Exception Target Method:
 ValidateMessageSecurity</ExceptionInfo></detail>
</soap:Body></soap:Envelope>

有人可以就我如何解决这个问题提出建议/建议吗?

预先感谢您的协助!

1 个答案:

答案 0 :(得分:0)

所以我找到了问题的答案。在我的情况下,似乎SOAPClient不是最好的方法。相反,更好的方法是通过CURL创建,发送和接收SOAP消息。以下是我在另一个Stackoverflow页面上找到的示例。我根据自己的情况调整了它,效果很好!

$credentials = "username:pass"; 
$url = "https://url/folder/sample.wsdl";
$body = ''; /// Your SOAP XML needs to be in this variable

$headers = array( 
'Content-Type: text/xml; charset="utf-8"', 
'Content-Length: '.strlen($body), 
'Accept: text/xml', 
'Cache-Control: no-cache', 
'Pragma: no-cache', 
'SOAPAction: "customerSearch"'
); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);

curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $body); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $credentials);

$data = curl_exec($ch);