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

PHP SoapClient使用托管在Windows 2008 Server上的Windows应用程序中的WCF服务,php,wcf,Php,Wcf,这个问题涉及使用Windows 2008 Server上的Windows应用程序中托管的WCF服务、托管在同一服务器上的IIS 7中的PHP脚本以及托管在其他位置的其他应用程序的要求 该应用程序已使用Visual Studio 2010、.NET Framework 4、IIS 7和各种版本的PHP在Windows 7计算机上进行了全面的开发和测试 在Windows7机器上,netsh的使用方式如下 netsh http add urlacl url=http://localhost:8000/

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

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

在Windows7机器上,netsh的使用方式如下

netsh http add urlacl url=http://localhost:8000/WCFService/ user=machinename\user
在测试期间,还成功添加和使用了其他各种端口

将应用程序复制到Windows 2008服务器时,成功测试了应用程序的关键部分

Windows 2008 Server上使用了相同的netsh命令,但localhost被替换为服务器IP,machinename与domain如下所示:

netsh http add urlacl url=http://serveripaddress:8000/WCFService/ user=domain\user
try {
  $client = new SoapClient("http://serveripaddress:8000/WCFService/?wsdl");
} catch (Exception $e) {
  echo $e->getMessage(), "\n"; 
  exit();
}
在尝试使PHP SoapClient工作期间,尝试了各种user=“…”选项,包括“everyone”

初始PHP SoapClient脚本如下所示:

netsh http add urlacl url=http://serveripaddress:8000/WCFService/ user=domain\user
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“在 第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"

我认为当前的问题与服务的“可见性”、对客户的“可见性”以及可能的权限有关

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

任何帮助都将不胜感激


非常感谢。

如果您正在托管WCF服务,以便php客户端访问它,那么您需要一个扁平的wsdl。关于如何生成平面Wsdl,请参见以下链接:


同样的功能也可以作为.NET4.5的一部分在框架中使用。希望这对您有所帮助。

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

这可能是答案。.NET的默认配置会导致此错误。

你好,拉杰什,谢谢你的回答。我当然会仔细看看你提供的链接上的帖子。我想补充的是,我的解决方案在Windows7下的开发系统中工作得非常好,基本上使用相同的wsdl。我不确定这是否会对扁平wsdl产生影响。要使您的服务具有互操作性,最好的方法是使用扁平wsdl。在您的开发环境中,您可能有权访问服务器以在上述位置下载xsd?xsd=xsd1等,但假设外部客户机试图访问服务器上的资源。svc?xsd=xsd1。您服务器上的防火墙可能不允许访问该资源。Rajesh,这确实帮助我克服了SoapClient创建错误,非常感谢。它似乎确认了这些问题与wsdl和wcf配置有关,而不是访问问题,因此这条隧道的尽头是光明的。目前,我在方法调用过程中遇到了错误。此服务最初是使用添加新服务库时生成的默认接口构建的,因此需要调用GetData。指示配置问题的错误之一是以下错误。捕获的异常:对操作“GetData”的请求消息体进行反序列化时出错。OperationFormatter遇到无效的消息正文。应找到名为“GetData”且命名空间为“”的节点类型“Element”。找到名为“parameters”和命名空间为“Element”的节点类型始终欢迎指向潜在解决方案的链接,但请在该链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。