2009-07-15 3 views
0

J'ai une enveloppe de savon qui est renvoyée par un service PHP RPC codé que j'ai écrit qui déclare un espace de noms dans le nœud racine de l'enveloppe SOAP. Cependant, je veux que cet espace de noms soit dans le nœud racine de la charge utile xml dans le corps SOAP. Au fond, je veux ceci:Déplacer l'espace de noms de la racine de l'enveloppe SOAP vers la charge utile xml

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="http://sample.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org 
/soap/encoding/"> 
    <SOAP-ENV:Body> 
    <ns1:ServiceResponse> 
     <outgoingVar1>true</outgoingVar1> 
    </ns1:ServiceResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

pour devenir ceci:

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org 
/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP- 
ENC="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
    <ServiceResponse xmlns="http://sample.com"> 
     <outgoingVar1>true</outgoingVar1> 
    </ServiceResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

et voici mon annotée (à gauche des déclarations d'espace de nom trivial) WSDL tel qu'il est en ce moment:

<wsdl:definitions name="IJLSoapResponse" targetNamespace="http://casey.com" tns="http://casey.com" xmlns:samp="http://sample.com" ...> 
<wsdl:types> 
    <xsd:schema targetNamespace="http://casey.com" ...> 
     <xsd:element name="incomingVar1" type="xsd:string" nillable="true"/> 
     <xsd:element name="incomingVar2" type="xsd:string" nillable="true"/> 
    </xsd:schema> 
    <xsd:schema targetNamespace="http://sample.com" ...> 
     <xsd:element name="outgoingVar1" type="xsd:boolean" nillable="true"/> 
    </xsd:schema> 
</wsdl:types> 
<wsdl:message name="ServiceInput"> 
    <wsdl:part name="incomingVar1" element="tns:incomingVar1"/> 
    <wsdl:part name="incomingVar2" element="tns:incomingVar2"/> 
</wsdl:message> 
<wsdl:message name="ServiceOutput"> 
    <wsdl:part name="outgoingVar1" element="samp:outgoingVar1"/> 
</wsdl:message> 
<wsdl:portType name="ServicePortType"> 
    <wsdl:operation name="ServiceMessage" parameterOrder="incomingVar1 incomingVar2"> 
     <wsdl:input name="ServiceMessageRequest" message="tns:ServiceInput"/> 
     <wsdl:output name="ServiceMessageResponse" message="tns:ServiceOutput"/> 
    </wsdl:operation> 
</wsdl:portType> 
<wsdl:binding name="ServiceBinding" type="tns:ServicePortType"> 
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="ServiceMessage"> 
     <soap:operation soapAction="http://casey.com/soap/Service"/> 
     <wsdl:input name="ServiceRequest"> 
      <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://casey.com"/> 
     </wsdl:input> 
     <wsdl:output name="ServiceResponse"> 
      <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://sample.com"/> 
     </wsdl:output> 
    </wsdl:operation> 
</wsdl:binding> 
<wsdl:service name="ServiceService"> 
    <wsdl:port name="ServicePort" binding="tns:ServiceBinding"> 
     <soap:address location="http://casey.com/soap/Service"/> 
    </wsdl:port> 
</wsdl:service> 
</wsdl:definitions> 

Y a-t-il quelque chose dans le WSDL qui peut être modifié afin de forcer cet espace de noms dans la charge utile? J'ai essayé de le déplacer à plusieurs endroits différents en vain. Merci de votre aide. PS Si vous voyez quelque chose de mal avec le WSDl dans la mesure où il n'est pas en cours de validation ou quelque chose de similaire, ignorez-le ... l'original valide/déploie/fonctionne correctement. Je suis plus inquiet de savoir où je peux mettre l'espace de noms. Merci!

Répondre

0

Peu importe où l'espace de noms est déclaré, à moins que le code qui utilise votre message SOAP ne fasse quelque chose de mal. Puisque les deux exemples "before" et "after" sont fonctionnellement équivalents, ils sont tous les deux corrects par rapport à WSDL, donc changer WSDL n'aura aucun effet à cet égard.

+0

C'était aussi ma pensée originale. Alors, peut-être que je pose la mauvaise question. La réponse de ce service est consommée par un client WCF qui utilise un proxy. L'enveloppe de savon vient avec un vrai comme le premier exemple ci-dessus, mais la valeur sort faux quand le proxy est fait avec lui. Donc, je pensais que le proxy dépouillait la charge utile de l'enveloppe de savon et donc ns1 n'aurait plus d'espace de noms déclaré. Est-ce que j'aboie le mauvais arbre? Y a-t-il une autre raison à cela? –

+0

Beats moi, puisque je ne suis pas familier avec WCF :) Mais si le proxy fait ce que vous décrivez, alors il est bogué. – ykaganovich

+0

Merci pour votre aide. Je vais republier mon commentaire en tant que question de proxy WCF. –