views:

554

answers:

1

I've got a soap envelope that is returned from a encoded RPC PHP service that I wrote that declares a namespace in the root node of the SOAP envelope. However, I want that namespace to be in the root node of the xml payload in the SOAP body. Basically, I want this:

<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>

to become this:

<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/"&gt;
  <SOAP-ENV:Body>
    <ServiceResponse xmlns="http://sample.com"&gt;
       <outgoingVar1>true</outgoingVar1>
    </ServiceResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

and here is my annotated (left out trivial namespace declarations) WSDL as it stands right now:

<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"/&gt;
 <wsdl:operation name="ServiceMessage">
  <soap:operation soapAction="http://casey.com/soap/Service"/&gt;
  <wsdl:input name="ServiceRequest">
   <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://casey.com"/&gt;
  </wsdl:input>
  <wsdl:output name="ServiceResponse">
   <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://sample.com"/&gt;
  </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"/&gt;
 </wsdl:port>
</wsdl:service>
</wsdl:definitions>

Is there something in the WSDL that can be changed in order to force that namespace into the payload? I've tried moving it around to several different places to no avail. Thanks for your help.

PS If you see something wrong with the WSDl as far as it not being validating or something similar, just disregard it...the original validates/deploys/works fine. I'm more worried about where I can put the namespace. Thanks!

A: 

It should not matter where the namespace is declared unless the code that's consuming your SOAP message is doing something wrong.

Since both "before" and "after" examples are functionally equivalent, they are both correct with respect to WSDL, so changing WSDL is not going to have any effect in this respect.

ykaganovich
That was my original thought as well. So, maybe I'm asking the wrong question. The response of this service is being consumed by a WCF client that uses a proxy. The soap envelope comes in with a true like the first example above, but the value comes out false when the proxy is done with it. So, I was thinking that the proxy was stripping the payload out of the soap envelope and thus ns1 would no longer have a declared namespace. Am I barking up the wrong tree? Is there some other reason for this?
Beats me, since I'm not familiar with WCF :) But if the proxy does what you describe, then it's buggy.
ykaganovich
Thanks for your help. I'll repost my comment as a WCF proxy question.