通过PHP消费的ASP服务器上的SOAP Web服务

通过PHP消费的ASP服务器上的SOAP Web服务

问题描述:

我试图使用PHP和SOAP使用Web服务。 Web服务使用.NET构建,并托管在ASP服务器上。我正在使用以下代码与API进行交互,但我一直在解析WSDL时遇到错误。 PHP UNIX服务器有一个SSL证书,Web服务主机也有一个SSL证书,我使用https来启动事务。通过PHP消费的ASP服务器上的SOAP Web服务

这种特殊的API调用请求字符串一个会员号:

$wsdl=' https://domain.com/ws.asmx?wsdl ';

$client=new SOAPClient($wsdl, array('exceptions'=>0));

$result=$client->IsMemberCurrent('123456789');

错误:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'domain/ws.asmx?wsdl' : Start tag expected, '<' not found in index.php on line 4 

我可以看到WSDL内容,但我收到错误消息通过PHP表明它无法看到或无法处理WSDL文件?

SOAP 1.2 service description:POST /SubscriberAPI.asmx HTTP/1.1 
Host: subdomain.domain.com 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap12:Body> 
    <IsMemberCurrent xmlns="http://www.domain.com/"> 
     <MembershipNo>string</MembershipNo> 
    </IsMemberCurrent> 
    </soap12:Body> 
</soap12:Envelope> 

看来你不能访问WSDL文件。所以你需要诊断问题。

尝试

echo htmlentities(file_get_contents($wsdl));

它会给你更好的洞察力,以什么PHP得到作为响应。

一旦你的SoapClient工作,你的下一行代码将无法按预期工作。

您需要将您的参数包装在关联数组中,否则Web服务将无法识别它。

此外,由.NET Web服务返回的响应将是一个IsMemberCurrentResponse对象,它包含一个IsMemberCurrentResult,因此您需要用以下代码替换最后一行。

$params = array('MembershipNo'=>'1234567890'); 
$response = $client->IsMemberCurrent($params); 
$result = $response->IsMemberCurrentResult; 
+0

感谢您的提示。我按照建议完成了,但是我得到的回报是相同的 - 无法加载错误。这是否意味着防火墙问题,因为当我尝试直接从Web浏览器访问WSDL文件时,我能够看到WSDL文件? – chocolatecoco 2010-07-07 13:11:17

+0

如果它在file_get_contents上出现错误,那么它是连接到IIS框的问题,而不是IIS或ASP.NET的问题。 这可能是一个防火墙问题 - 但需要更多的信息。 除了无法加载以外,还能获得更多信息吗? 您正在使用的Web浏览器位于UNIX服务器上吗? 你可以尝试通过HTTP而不是https? – 2010-07-07 13:19:58

+0

我的web服务器使用PHP/UNIX,我试过HTTP和HTTPS,但是我得到的错误是它无法解析WSDL文件。您在我的原始文章中看到的错误消息是PHP显示的所有信息,除非有可用于提取更多信息的调试方法? – chocolatecoco 2010-07-07 13:23:15