Per PHP auf Webservice zugreifen

9. Januar 2013 15:32

Hallo,

ich versuche gerade per PHP Daten aus AX über Webservices zu holen!

Ich scheitere allerdings schon am Aufbau der Verbindung!

Wenn ich mit
Code:
<?php
   $objClient = new SoapClient('http://ax2012-a:8101/DynamicsAx/Services/AXCustomerServiceGroup', array('soap_version'   => SOAP_1_2));
?>

versuche eine Verbindung über die WSDL-Datei ('http://ax2012-a:8101/DynamicsAx/Services/AXCustomerServiceGroup) herzustellen, erhalte ich diesen Fehler:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Could not find any usable binding services in WSDL. in C:\xampp\htdocs\ax2012WebService\index.php:2 Stack trace: #0 C:\xampp\htdocs\ax2012WebService\index.php(2): SoapClient->SoapClient('http://ax2012-a...', Array) #1 {main} thrown in C:\xampp\htdocs\ax2012WebService\index.php on line 2


Kann mir da jemand weiterhelfen, bzw. hat schon mal mit PHP erfolgreich solch eine Verbindung hergestellt?
Das ist meine WSDL:
Code:
  <?xml version="1.0" encoding="utf-8" ?>
- <wsdl:definitions name="AXCustomerServiceGroup" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:tns="http://tempuri.org/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:i0="http://custservice" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
- <wsp:Policy wsu:Id="NetTcpBinding_AXCustomerService_policy">
- <wsp:ExactlyOne>
- <wsp:All>
  <msb:BinaryEncoding xmlns:msb="http://schemas.microsoft.com/ws/06/2004/mspolicy/netbinary1" />
- <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
- <wsp:Policy>
- <sp:TransportToken>
- <wsp:Policy>
- <msf:WindowsTransportSecurity xmlns:msf="http://schemas.microsoft.com/ws/2006/05/framing/policy">
  <msf:ProtectionLevel>EncryptAndSign</msf:ProtectionLevel>
  </msf:WindowsTransportSecurity>
  </wsp:Policy>
  </sp:TransportToken>
- <sp:AlgorithmSuite>
- <wsp:Policy>
  <sp:Basic256 />
  </wsp:Policy>
  </sp:AlgorithmSuite>
- <sp:Layout>
- <wsp:Policy>
  <sp:Strict />
  </wsp:Policy>
  </sp:Layout>
  </wsp:Policy>
  </sp:TransportBinding>
  <wsaw:UsingAddressing />
  </wsp:All>
  </wsp:ExactlyOne>
  </wsp:Policy>
  <wsdl:import namespace="http://custservice" location="http://ax2012-a:8101/DynamicsAx/Services/AXCustomerServiceGroup?wsdl=wsdl0" />
  <wsdl:types />
- <wsdl:binding name="NetTcpBinding_AXCustomerService" type="i0:AXCustomerService">
  <wsp:PolicyReference URI="#NetTcpBinding_AXCustomerService_policy" />
  <soap12:binding transport="http://schemas.microsoft.com/soap/tcp" />
- <wsdl:operation name="getCreditLimit">
  <soap12:operation soapAction="http://custservice/AXCustomerService/getCreditLimit" style="document" />
- <wsdl:input name="AXCustomerServiceGetCreditLimitRequest">
  <soap12:header message="i0:AXCustomerServiceGetCreditLimitRequest_Headers" part="context" use="literal" />
  <soap12:body use="literal" />
  </wsdl:input>
- <wsdl:output name="AXCustomerServiceGetCreditLimitResponse">
  <soap12:body use="literal" />
  </wsdl:output>
- <wsdl:fault name="AifFaultFault">
  <soap12:fault name="AifFaultFault" use="literal" />
  </wsdl:fault>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="AXCustomerServiceGroup">
- <wsdl:port name="NetTcpBinding_AXCustomerService" binding="tns:NetTcpBinding_AXCustomerService">
  <soap12:address location="net.tcp://ax2012-a:8201/DynamicsAx/Services/AXCustomerServiceGroup" />
- <wsa10:EndpointReference>
  <wsa10:Address>net.tcp://ax2012-a:8201/DynamicsAx/Services/AXCustomerServiceGroup</wsa10:Address>
- <Identity xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
  <Spn>host/AX2012-A.contoso.com</Spn>
  </Identity>
  </wsa10:EndpointReference>
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>


Danke

Re: Per PHP auf Webservice zugreifen

9. Januar 2013 18:41

flaggschiff hat geschrieben:Hallo,

ich versuche gerade per PHP Daten aus AX über Webservices zu holen!

Ich scheitere allerdings schon am Aufbau der Verbindung!

Wenn ich mit
Code:
<?php
   $objClient = new SoapClient('http://ax2012-a:8101/DynamicsAx/Services/AXCustomerServiceGroup', array('soap_version'   => SOAP_1_2));
?>

versuche eine Verbindung über die WSDL-Datei ('http://ax2012-a:8101/DynamicsAx/Services/AXCustomerServiceGroup) herzustellen, erhalte ich diesen Fehler:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Could not find any usable binding services in WSDL. in C:\xampp\htdocs\ax2012WebService\index.php:2 Stack trace: #0 C:\xampp\htdocs\ax2012WebService\index.php(2): SoapClient->SoapClient('http://ax2012-a...', Array) #1 {main} thrown in C:\xampp\htdocs\ax2012WebService\index.php on line 2


Kann mir da jemand weiterhelfen, bzw. hat schon mal mit PHP erfolgreich solch eine Verbindung hergestellt?
Das ist meine WSDL:
Code:
  <?xml version="1.0" encoding="utf-8" ?>
- <wsdl:definitions name="AXCustomerServiceGroup" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:tns="http://tempuri.org/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:i0="http://custservice" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
- <wsp:Policy wsu:Id="NetTcpBinding_AXCustomerService_policy">
- <wsp:ExactlyOne>
- <wsp:All>
  <msb:BinaryEncoding xmlns:msb="http://schemas.microsoft.com/ws/06/2004/mspolicy/netbinary1" />
- <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
- <wsp:Policy>
- <sp:TransportToken>
- <wsp:Policy>
- <msf:WindowsTransportSecurity xmlns:msf="http://schemas.microsoft.com/ws/2006/05/framing/policy">
  <msf:ProtectionLevel>EncryptAndSign</msf:ProtectionLevel>
  </msf:WindowsTransportSecurity>
  </wsp:Policy>
  </sp:TransportToken>
- <sp:AlgorithmSuite>
- <wsp:Policy>
  <sp:Basic256 />
  </wsp:Policy>
  </sp:AlgorithmSuite>
- <sp:Layout>
- <wsp:Policy>
  <sp:Strict />
  </wsp:Policy>
  </sp:Layout>
  </wsp:Policy>
  </sp:TransportBinding>
  <wsaw:UsingAddressing />
  </wsp:All>
  </wsp:ExactlyOne>
  </wsp:Policy>
  <wsdl:import namespace="http://custservice" location="http://ax2012-a:8101/DynamicsAx/Services/AXCustomerServiceGroup?wsdl=wsdl0" />
  <wsdl:types />
- <wsdl:binding name="NetTcpBinding_AXCustomerService" type="i0:AXCustomerService">
  <wsp:PolicyReference URI="#NetTcpBinding_AXCustomerService_policy" />
  <soap12:binding transport="http://schemas.microsoft.com/soap/tcp" />
- <wsdl:operation name="getCreditLimit">
  <soap12:operation soapAction="http://custservice/AXCustomerService/getCreditLimit" style="document" />
- <wsdl:input name="AXCustomerServiceGetCreditLimitRequest">
  <soap12:header message="i0:AXCustomerServiceGetCreditLimitRequest_Headers" part="context" use="literal" />
  <soap12:body use="literal" />
  </wsdl:input>
- <wsdl:output name="AXCustomerServiceGetCreditLimitResponse">
  <soap12:body use="literal" />
  </wsdl:output>
- <wsdl:fault name="AifFaultFault">
  <soap12:fault name="AifFaultFault" use="literal" />
  </wsdl:fault>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="AXCustomerServiceGroup">
- <wsdl:port name="NetTcpBinding_AXCustomerService" binding="tns:NetTcpBinding_AXCustomerService">
  <soap12:address location="net.tcp://ax2012-a:8201/DynamicsAx/Services/AXCustomerServiceGroup" />
- <wsa10:EndpointReference>
  <wsa10:Address>net.tcp://ax2012-a:8201/DynamicsAx/Services/AXCustomerServiceGroup</wsa10:Address>
- <Identity xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
  <Spn>host/AX2012-A.contoso.com</Spn>
  </Identity>
  </wsa10:EndpointReference>
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>


Danke


Die Googlesuche liefert u.a. das hier, vielleicht hilft es dir, ich habs mir nicht komplett angeschaut:
http://www.youtube.com/watch?v=sn9I6TaQY9o


Ansonsten würde ich an deiner Stelle mich an den MS-Partner wenden, der deine AX 2012 Installation betreut und ihn bitten im Partner Source nach einer brauchbaren technischen Doku zu Web Services mit AX 2012 zu suchen und dir zur Verfügung zu stellen.

Re: Per PHP auf Webservice zugreifen

14. Januar 2013 14:05

Hi,

kann es sein, dass du versucht einen Service mit dem AIF von AX bereit zu stellen, aber keinen "extra" IIS verwendest?

Wenn ich es richtig gesehen habe steht im WSDL, dass NetTCP als Protokoll verwendet werden soll.

flaggschiff hat geschrieben:<soap12:address location="net.tcp://ax2012-a:8201/DynamicsAx/Services ... rviceGroup" />


Ich bin mir nicht ganz sicher aber kann PHP einen TCP/IP basierten Service aufrufen?
Ich denke aber, dass du in AX das Protokoll für den Service ändern musst, damit das Ganze funktioniert. Du solltest den Service in AX auf HTTP umstellen.
Hierfür brauchst du aber einen "extra" ISS Server, welchen den Webservice bereit stellt.

Re: Per PHP auf Webservice zugreifen

16. Januar 2013 12:54

Hey,

ich hab jetzt mal eine Service mit HTTP erstellt.
Hab IIS unter der Ordner AIF ein Application angelegt "phpconnect" und darin nur den bin-Ordner den er immer wünscht.
Der Service lies sich auch aktivieren.

Er erzeugt mir dann einen HTTP-Link: http://ax2012-a:85/phpconnect/AXCustome ... ervice.svc
`The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.

Requested URL: /phpconnect/AXCustomerServiceGroupHttp/xppservice.svc


Allerdings existiert die Datei da garnicht. Hat also auch keine angelegt. Muss seitens IIS noch was installiert werden?
Gibt es vlt. irgendwo ein Tutorial dazu?

Danke

Re: Per PHP auf Webservice zugreifen

11. Februar 2013 15:06

Weiß jemand warum mir die Datei xppservice.svc nicht erstellt wird?