2009-11-17 3 views
0

Je ne sais pas comment faire correctement un élément de faute dans un fichier wsdl qui représente une exception PHP.Comment supporter les exceptions PHP dans un fichier wsdl

J'ai créé un service Web PHP qui lève une exception à des fins de test. Lorsque j'appelle ce service Web dans un projet C# de test, j'obtiens une exception de réflexion avec le message "L'élément a déjà été ajouté.Clé dans le dictionnaire: 'System.Object' Clé ajoutée: 'System.Object'". Donc, cela signifie évidemment que je n'ai pas créé correctement l'élément fault dans le fichier wsdl.

Répondre

0

Je ne connais pas PHP, ou comment il est évident que vous avez fait une erreur dans la création de votre élément de faute. Et je ne sais ce que votre wsdl ou votre php ressemble, mais voici un exemple d'un wsdl avec un message d'erreur qui fonctionne:

<?xml version="1.0"?> 
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" 
        xmlns:tns="http://www.your.site/YourService" 
        targetNamespace="http://www.your.site/YourService" 
        name="ays"> 
    <xsd:import schemaLocation="http://www.your.site/YourService/AtYourService.xsd" 
       namespace="http://www.your.site/YourService"/> 
    <wsdl:message name="Input"> 
     <wsdl:part name="parameters" 
        element="tns:Question"/> 
    </wsdl:message> 

    <wsdl:message name="Output"> 
     <wsdl:part name="info" 
        element="tns:Answer"/> 
    </wsdl:message> 

    <wsdl:message name="Fault"> 
     <wsdl:part name="detail" 
        element="tns:FaultMessage"/> 
    </wsdl:message> 

    <wsdl:portType name="YourPortType"> 
     <wsdl:operation name="Question"> 
      <wsdl:input wsaw:Action="http://www.your.site/YourService/Question" 
         message="tns:Input"/> 
      <wsdl:output wsaw:Action="http://www.your.site/YourService/Answer" 
         message="tns:Output"/> 
      <wsdl:fault wsaw:Action="http://www.your.site/YourService/Fault" 
         name="QuestionFault" 
         message="tns:Fault"/> 
     </wsdl:operation> 
    </wsdl:portType> 

    <wsdl:binding name="YourBinding" 
        type="tns:YourPortType"> 
     <wsdl:operation name="Question"> 
      <soap:operation soapAction="http://www.your.site/YourService/Question" style="document"/> 
      <wsdl:input> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="QuestionFault"> 
       <soap:fault name="QuestionFault" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 
    </wsdl:binding> 

    <wsdl:service name="YourService"> 
     <wsdl:port name="YourBinding" binding="tns:YourBinding"> 
      <soap:address location="http://www.your.site/YourService"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Cordialement MIEL.

0

Je pense qu'il est préférable de retourner le message d'erreur avec le code d'état http = 200 et content-type = text/xml. Ainsi, vous pouvez attraper le message d'erreur dans Flash et Flex

header("status: 200"); 
    header("Content-Type: text/xml; charset=utf-8"); 
    try { 
     $wsdl = "http://wsdluri"; 
     $serverConfig = array("soap_version"=> SOAP_1_2, "encoding" => "UTF-8"); 
     $server = new SoapServer($wsdl, $serverConfig); 
     $server->setObject($myService); 
     $server->handle($HTTP_RAW_POST_DATA); 
    } catch (Exception $exception) { 
    $xmlstr = 
    <<<XML 
    <?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
    <SOAP-ENV:Fault> 
    <faultcode>{$exception->getCode()}</faultcode> 
    <faultstring>{$exception->getMessage()}</faultstring> 
    <detail><![CDATA[{$exception->getTraceAsString()}]]></detail> 
    </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 
    XML; 
    echo $xmlstr; 
    } 
} 
Questions connexes