使用WCF服务的PHP SoapClient托管在Windows 2008 Server上的Windows应用程序中

时间:2011-12-06 05:22:40

标签: php wcf

此问题涉及在Windows 2008 Server上使用Windows应用程序中托管的WCF服务的要求,来自同一服务器上的IIS 7中托管的PHP脚本以及其他位置托管的其他应用程序。

该应用程序已在使用Visual Studio 2010,.NET Framework 4,IIS 7和各种版本的PHP的Windows 7计算机上进行了彻底的开发和测试。

在Windows 7计算机上,使用netsh如下。

netsh http add urlacl url=http://localhost:8000/WCFService/ user=machinename\user

在测试期间还成功添加并使用了各种其他端口。

将应用程序复制到Windows 2008 Server时,应用程序的基本部分已成功通过测试。

在Windows 2008 Server上使用了相同的netsh命令,但localhost已替换为服务器IP和带有域的machinename,如下所示:

netsh http add urlacl url=http://serveripaddress:8000/WCFService/ user=domain\user

在尝试使用PHP SoapClient时,尝试了各种user =“...”选项,包括“everyone”。

最初的PHP SoapClient脚本如下:

try {
  $client = new SoapClient("http://serveripaddress:8000/WCFService/?wsdl");
} catch (Exception $e) {
  echo $e->getMessage(), "\n"; 
  exit();
}

在初始测试期间,遇到以下错误:

  

警告:   SoapClient的:: SoapClient的(HTTP:// serveripaddress:8000 / WCFService / WSDL)   [soapclient.soapclient]:无法打开流:HTTP请求失败!   在第7行的C:\ inetpub \ wwwroot \ Sites \ www.myurl.com \ WCF-Test.php

     

警告:SoapClient :: SoapClient()[soapclient.soapclient]:I / O   警告:无法加载外部实体   “http:// serveripaddress:8000 / WCFService /?wsdl”in   第7行的C:\ inetpub \ wwwroot \ Sites \ www.myurl.com \ WCF-Test.php

     

SOAP-ERROR:解析WSDL:无法加载   'http:// serveripaddress:8000 / WCFService /?wsdl':无法加载   外部实体“http:// serveripaddress:8000 / WCFService /?wsdl”

经过一番摆弄后,错误减少到以下几点:

  

SOAP-ERROR:解析WSDL:无法加载   'http:// serveripaddress:8000 / WCFService /?wsdl':无法加载   外部实体“http:// serveripaddress:8000 / WCFService /?wsdl”

然后我将wsdl解压缩到一个文件中并使用以下PHP脚本:

try {
  $client = new SoapClient("wsdl\wcf-wsdl.wsdl");
} catch (Exception $e) {
  echo $e->getMessage(), "\n"; 
  exit();
}

然后错误稍微改变为以下内容:

  

SOAP-ERROR:解析架构:无法从中导入架构   的 'http:// serveripaddress:8000 / WCFService / XSD = xsd0'

我认为手头的问题与服务的“可见性”,客户端以及可能的权限有关。

在阅读了几十篇文章之后,我仍然无法找到解决这个问题的方法。

非常感谢任何帮助。

非常感谢提前。

3 个答案:

答案 0 :(得分:0)

如果您正在托管WCF服务以供PHP客户端访问,您需要拥有一个平面的wsdl。关于如何生成Flat Wsdl,请点击以下链接:

How to flatten your wsdl

作为.NET 4.5的一部分,在框架中可以使用相同的功能。希望能帮到你。

答案 1 :(得分:0)

如果您知道您正在使用.NET WCF服务,您只需将从.svc?wsdl下载wsdl的位置更改为.svc?singleWsdl,WCF服务器将为您处理递归/链接工作

答案 2 :(得分:0)

这可能是答案,.net有默认配置发生此错误。 https://bugs.php.net/bug.php?id=47761