PHP SoapClient: Problems with Distributed WSDL File

冷暖自知 提交于 2019-12-12 12:10:42

问题


I have a problem using a distributed WSDL File (scheme / other definitions are declared outside the actual WSDL) with PHP's SoapClient.

This is the fault message I got:

SOAP-ERROR: Parsing WSDL:  'getSomeInfo' already defined.

After some googling, it seems to be a bug inside PHP as someone else discovered exactly the same problem: http://bugs.php.net/bug.php?id=45282

Has there been any bug fix(es)? Any solution to work around this bug?

I think posting a code snippet is senseless, since the invocation of the SoapClient ctor using just the WSDL is the only that fails.


回答1:


I had same issue. The problem was in wsdl and imports, I saved wsdl from site and pointed soapclient to use local file, but all references were original. Soap client each time gets file from remote host, went to parts, and from them back to same file but on remote drive. That caused same file to be loaded twice. Solution is to use only remote files or to rewrite paths to local (all). SoapUI does that when you hit "export definitions" on project wsdl. Hope that will help others.




回答2:


The PHP source code (svn) which takes care of the import nodes contains the comment /* TODO: namespace ??? */. Namespaces are ignored which enables the method collisions to occur.

Three solutions are proposed:

  1. Fix the source code to cater for namespaces (which would be very welcome)
  2. Manipulate the WSDL files to prevent such method overlaps (this is likely not an option at all)
  3. Instead of using the original WSDL file, call the imported ones individually (or group ones which do not have method name collisions) with separate SoapClient instances.

Sorry that I can't be of more help.




回答3:


Download a local copy of the WSDL file. Remove duplicate method names. Update your soap client to use the local WSDL file. This has worked well for me in the past.




回答4:


I had the same issue while accessing a WCF service providing multiple endpoints through PHP. In my case, it turned out that the main WSDL imports sub-WSDLs for each endpoint, while the sub-WSDLs do include the main-WSDL in turn. This is apparently the reason why PHP reads the main-WSDL twice and comes up with the "already defined"-error. I could avoid this behavior by creating the client with the sub-WSDL URL of the desired endpoint instead of the main WSDL URL.



来源:https://stackoverflow.com/questions/2342419/php-soapclient-problems-with-distributed-wsdl-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!