0

我已经在这里问了一个与此主题相关的问题,但没有任何帮助。现在我对 SOAP 有了更多的了解,并且可以提供更多信息,我希望你们中的某个人可能知道它为什么不起作用。

  1. 我正在尝试在 PHP 中设置一个小 SoapClient 来访问外部 Web 服务。
  2. 这个 SoapClient 需要在我当地的大学里运行在代理后面。
  3. extern WSDL 文件通过 IP-Check 保护。

这就是我所知道的:

$ExternWSDLFile = "http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl";
$LocalUniversityProxy = "proxy.krz.uni-heidelberg.de:8080";

在我总是尝试通过用户/密码访问 WSDL 并且我长时间没有工作之后,他们告诉我,用户/密码不是必需的,WSDL 身份验证只能通过 IP-Check 完成。所以我不必再像我以前想和尝试过的那样给 SoapClient 任何用户/密码组合。

这是我首先从注册 IP 地址的大学计算机上尝试的:

$wsdl = "http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl";    
$Client = new SoapClient($wsdl,array('trace' => 1, 'exception' => 0, 'cache_wsdl' => 0));
$Authentification = $Client->authenticate();
var_dump($Client);
var_dump($Authentification);

仍然没有工作,虽然从外部私人 PC 上运行相同的代码,但至少没有给出错误消息,而是一个完全初始化的 Soap-Object。University-PC 上的此代码仅生成如下错误消息:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl' : failed to load external entity "http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl" in E:\xampp\htdocs\test.php:17 Stack trace: #0 E:\xampp\htdocs\test.php(17): SoapClient->SoapClient('http://search.w...', Array) #1 {main} thrown in E:\xampp\htdocs\test.php on line 17 

所以这肯定是因为大学代理而失败的!

接下来我尝试在本地获取 WSDL 文件,因为这通常是我从 Google 那里得到的提示。

$auth = base64_encode('KHD\user:pass');
$header = array("Authorization: Basic $auth");
$Proxy = 'proxy.krz.uni-heidelberg.de:8080';
$Context = stream_context_create(array('http' => array('proxy' => $Proxy,'request_fulluri' => True,'header' => $header,),));

$wsdl = file_get_contents("http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl",false,$Context);

在 $wsdl 上使用 print_r() 给了我正确的本地缓存 WSDL 文件。但是现在使用该 $wsdl 设置 SoapClient 它再次因消息而中断:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from '<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="WOKMWSAuthenticateService" targetNamespace="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xs:element name="authenticate" type="tns:authenticate" /> <xs:element name="authenticateResponse" type="tns:authenticateResponse" /> <xs:element name="closeSession" type="tns:closeSession" /> <xs:ele in E:\xampp\htdocs\test.php on line 12

我完全不知道为什么这不起作用。我完全遵循手册并尝试了很多东西。代理不断破坏我的工作,并且在私人/外部 PC 上,此脚本不可用,因为 IP 不匹配。

我能做些什么来最终让这个运行?

谢谢你的帮助!

4

1 回答 1

0

旧但认为我在这里分享给别人。我也遇到了这个问题。似乎有一个应该在 PHP 5.0 中修复的错误?其中 WSDL 文件将尝试在没有代理的情况下进行解析,但肥皂调用确实通过代理。见这里:https ://bugs.php.net/bug.php?id=29211 - 我觉得这很烦人。

于 2013-09-13T17:02:34.910 回答