Hi Dino,
I don't like to live dangerously so I did start with the WSDL first,
then wsdl2java, then tested my solution axis - axis, finally used Visual
C#.net to pull in a Web reference to my service and let it build
everything.
The underlying code it built looks very similar to what you attached:
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("",
RequestNamespace="urn:LookupBorrower",
ResponseNamespace="urn:LookupBorrower",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)
]
[return: System.Xml.Serialization.XmlElementAttribute("return")]
public string echoString(string inputString) {
object[] results = this.Invoke("echoString", new object[]
{inputString});
return ((string)(results[0]));
}
So all looks fine, but even though the SOAP looks ok when intercepted:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<echoStringResponse xmlns="urn:LookupBorrower">
<return xmlns="">Hi there</return>
</echoStringResponse>
</soapenv:Body>
</soapenv:Envelope>
The C# always gives a null for the retun value (Actually 'results' is an
array of size one with that element = null.
In trying to solve this, my assumption [I know those are dangerous] was
that the xmlns="" was causing it to not identify the element it was
looking for correctly.
Richard.
> -----Original Message-----
> From: Dino Chiesa [mailto:[EMAIL PROTECTED]
> Sent: 11 March 2005 17:49
> To: [email protected]; Anne Thomas Manes
> Subject: RE: Empty namespace - again
>
>
> > ....an empty namespace thus:
> >
> > <soapenv:Body>
> > <return xmlns="">Hello World</return>
> > </soapenv:Body>
> >
> > Following many threads on this list it is clear that this is a
> problem.
> >
> > If you are trying to consume an axis service in .net it
> appears to be
> > a 'show stopper'.
>
> No.
>
> xmlns="" is not a problem for .NET.
>
> With .NET, just as with AXIS, you can specify to the XML
> serialization engine the XML namespace to use for requests,
> responses, and embedded complextypes. You can specify other
> things, too, like the xml element name, or attribute name, or
> other stuff.
>
> In general, this is all done for you (by both AXIS and .NET), if you
> follow rule #1 and Start With WSDL First (tm).
>
> If you like to live dangerously, and not Start With WSDL
> First (tm) , then you need to modify the generated .NET
> client-side stubs to introduce or modify attributes on your
> methods and types, that agree with the XML put on the wire by AXIS.
>
> Here's some code that was generated by the .NET Wsdl.exe tool:
>
> [SoapDocumentMethodAttribute
> ("",
> RequestNamespace="urn:ionic.webservices.2005.03.Types",
> ResponseNamespace="urn:ionic.webservices.2005.03.Types",
> Use=System.Web.Services.Description.SoapBindingUse.Literal,
>
> ParameterStyle=System.Web.Services.Protocols.SoapParameterStyl
> e.Wrapped)
> ]
> [return: XmlElementAttribute("getComplexTypeReturn")]
> public MyComplexType getComplexType(string caller) {
> object[] results = this.Invoke("getComplexType", new object[] {
> caller});
> return ((MyComplexType)(results[0])); }
>
> This says,
> -Use "" for the SoapAction.
> -Use the specified strings for the request and response
> namespaces, Respectively. They need not be the same.
> -literal encoding
> -wrap the response in an element
> -the return element will be <getComplexTypeReturn>
>
>
> The generated type on the .NET side looks like
> [XmlType(Namespace="urn:ionic.webservices.2005.03.Types")]
> public class MyComplexType {
> ...
> }
>
> Which says, when serializing or de-serializing this type, the
> xml element should be in xmlns="urn:ionic.webservices.2005.03.Types".
>
> If you want xmlns="", then use [XmlType("")]. This says to
> .NET, when serializing or de-serializing, the XML element
> should have xmlns="".
>
> ....and the show goes on...
>
> By the way, the same sort of attribute-based tweaking of the
> behavior of the XML serializer is possible on the server
> side, for .NET services.
> So if you have a Java/AXIS webservice client that needs to
> consume an ASMX .NET webservice, you can use these same sorts
> of attributes to get
> the two sides to agree.
>
> ------
>
> Generally though, if you follow the first law of web services interop,
> you don't have to trouble yourself with *any of* these issues. The
> tools do it for you, which leaves more time for you to enjoy
> your life.
> [Come to think of it, I should probably start advising people
> to Start
> With WSDL First(tm). Hmm, good idea, Maybe I will do that....]
>
> -Dino
>
>
>
> -----Original Message-----
> From: Richard Wallis [mailto:[EMAIL PROTECTED]
> Sent: Friday, March 11, 2005 12:02 PM
> To: [email protected]; Anne Thomas Manes
> Subject: RE: Empty namespace - again
>
> Hi Anne,
>
> Thanks for this, but two problems:
> 1. My copy of XMLSpy complains "Message part 'parameters' (in Message
> echoStringRequest) - parameter intf:echoString: NS prefix
> does not refer to this schema!"
>
> But more importantly,
> 2. The problem still persists but nested 1 level down,
> 'return' still has xmlns="":
>
> <soapenv:Envelope
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
> <soapenv:Body>
> <echoStringResponse xmlns="urn:LookupBorrower">
> <return xmlns="">Hello mum</return>
> </echoStringResponse>
> </soapenv:Body>
> </soapenv:Envelope>
>
> Richard.
>
> > -----Original Message-----
> > From: Anne Thomas Manes [mailto:[EMAIL PROTECTED]
> > Sent: 11 March 2005 15:56
> > To: [email protected]
> > Subject: Re: Empty namespace - again
> >
> > Richard,
> >
> > This is not a valid doc/literal WSDL document. You need to
> define the
> > WSDL differently depending on whether you want rpc/encoded,
> > rpc/literal, of doc/literal.
> >
> > Here's how you should define your WSDL if you'd like to create a
> > doc/literal service conforming to the "wrapped"
> > programming convention (which offers the best interoperability with
> > .NET).
> >
> > <wsdl:definitions xmlns:impl="urn:LookupBorrower"
> > xmlns:intf="urn:LookupBorrower"
> > xmlns:apachesoap="http://xml.apache.org/xml-soap"
> > xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
> > xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> > xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
> > targetNamespace="urn:LookupBorrower">
> > <wsdl:types>
> > <xsd:schema targetNamepsace="urn:LookupBorrower">
> > <xsd:element name="echoString">
> > <xsd:complexType>
> > <xsd:sequence>
> > <xsd:element name="inputString" type="xsd:string"/>
> > </xsd:sequence>
> > </xsd:complexType>
> > </xsd:element>
> > <xsd:element name="echoResponse">
> > <xsd:complexType>
> > <xsd:sequence>
> > <xsd:element name="return" type="xsd:string"/>
> > </xsd:sequence>
> > </xsd:complexType>
> > </xsd:element>
> > </xsd:schema>
> > </wsdl:types>
> > <wsdl:message name="echoStringRequest">
> > <wsdl:part name="parameters" element="intf:echoString"/>
> > </wsdl:message>
> > <wsdl:message name="echoStringResponse">
> > <wsdl:part name="parameters" element="intf:echoResponse"/>
> > </wsdl:message>
> > <wsdl:portType name="LookupBorrower">
> > <wsdl:operation name="echoString">
> > <wsdl:input message="impl:echoStringRequest"/>
> > <wsdl:output message="impl:echoStringResponse"/>
> > </wsdl:operation>
> > </wsdl:portType>
> > <wsdl:binding name="LookupBorrowerSoapBinding"
> > type="impl:LookupBorrower">
> > <wsdlsoap:binding style="document"
> > transport="http://schemas.xmlsoap.org/soap/http"/>
> > <wsdl:operation name="echoString">
> > <wsdl:input>
> > <wsdlsoap:body use="literal"/>
> > </wsdl:input>
> > <wsdl:output>
> > <wsdlsoap:body use="literal"/>
> > </wsdl:output>
> > </wsdl:operation>
> > </wsdl:binding>
> > <wsdl:service name="LookupBorrowerService">
> > <wsdl:port name="LookupBorrower"
> > binding="impl:LookupBorrowerSoapBinding">
> > <wsdlsoap:address
> >
> > location="http://localhost:8080/axis/services/LookupBorrower"/>
> > </wsdl:port>
> > </wsdl:service>
> > </wsdl:definitions>
> >
> >
> > On Fri, 11 Mar 2005 15:37:34 -0000, Richard Wallis
> > <[EMAIL PROTECTED]> wrote:
> > > Here is the whole doc.
> > >
> > > For information I have tested this with all 4 possible
> > combinations of
> > > document/rpc & literal/encoded and the work fine axis to
> axis. The
> > > problem is that .net doesn't like xmlns="" or encoded.
> > >
> > > <wsdl:definitions xmlns:impl="urn:LookupBorrower"
> > > xmlns:intf="urn:LookupBorrower"
> > > xmlns:apachesoap="http://xml.apache.org/xml-soap"
> > > xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
> > > xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> > > xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> > > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
> > > targetNamespace="urn:LookupBorrower">
> > > <wsdl:message name="echoStringRequest">
> > > <wsdl:part name="inputString" type="xsd:string"/>
> > > </wsdl:message>
> > > <wsdl:message name="echoStringResponse">
> > > <wsdl:part name="return" type="xsd:string"/>
> > > </wsdl:message>
> > > <wsdl:portType name="LookupBorrower">
> > > <wsdl:operation name="echoString"
> > > parameterOrder="inputString">
> > > <wsdl:input
> > message="impl:echoStringRequest"/>
> > > <wsdl:output
> > message="impl:echoStringResponse"/>
> > > </wsdl:operation>
> > > </wsdl:portType>
> > > <wsdl:binding name="LookupBorrowerSoapBinding"
> > > type="impl:LookupBorrower">
> > > <wsdlsoap:binding style="document"
> > > transport="http://schemas.xmlsoap.org/soap/http"/>
> > > <wsdl:operation name="echoString">
> > > <wsdl:input>
> > > <wsdlsoap:body use="literal"
> > > encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> > > namespace="urn:LookupBorrower"/>
> > > </wsdl:input>
> > > <wsdl:output>
> > > <wsdlsoap:body use="literal"
> > > encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> > > namespace="urn:LookupBorrower"/>
> > > </wsdl:output>
> > > </wsdl:operation>
> > > </wsdl:binding>
> > > <wsdl:service name="LookupBorrowerService">
> > > <wsdl:port name="LookupBorrower"
> > > binding="impl:LookupBorrowerSoapBinding">
> > > <wsdlsoap:address
> > > location="http://localhost:8080/axis/services/LookupBorrower"/>
> > > </wsdl:port>
> > > </wsdl:service>
> > > </wsdl:definitions>
> > >
> > > Regards,
> > > Richard.
> > > > -----Original Message-----
> > > > From: Anne Thomas Manes [mailto:[EMAIL PROTECTED]
> > > > Sent: 11 March 2005 15:22
> > > > To: [email protected]
> > > > Subject: Re: Empty namespace - again
> > > >
> > > > Please provide the rest of the WSDL document.
> > > >
> > > > Can we assume that you have defined the <return> element
> > in the WSDL?
> > > >
> > > > Anne
> > > >
> > > >
> > > > On Fri, 11 Mar 2005 15:00:29 -0000, Richard Wallis
> > > > <[EMAIL PROTECTED]> wrote:
> > > > > Hi,
> > > > >
> > > > > This combination in the WSDL used as input to wsdl2java:
> > > > >
> > > > > <wsdlsoap:binding style="document" ...........
> > > > > <wsdlsoap:body use="literal" .........
> > > > >
> > > > > Results in an empty namespace thus:
> > > > >
> > > > > <soapenv:Body>
> > > > > <return xmlns="">Hello World</return>
> > > > > </soapenv:Body>
> > > > >
> > > > > Following many threads on this list it is clear that this
> > > > is a problem.
> > > > >
> > > > > If you are trying to consume an axis service in .net it
> > > > appears to be
> > > > > a 'show stopper'. I have tried use="encoded" but .net
> > > > rejects it, and
> > > > > also style="rpc" but still get xmlns="".
> > > > >
> > > > > As yet I have not been able to identify a work around
> for this.
> > > > > Although there seems to some hints of a bug fix for
> this in the
> > > > > pipeline, it is still a problem in 1.2RC3.
> > > > >
> > > > > Questions:
> > > > > 1. Is there a work around for this so that I can at
> > > > least use
> > > > > my axis service in .net?
> > > > >
> > > > > 2. Is there a fix for this that will appear in
> > the next RC?
> > > > >
> > > > >
> > > > > Richard Wallis
> > > > >
> > > > >
> > > >
> > > >
> > >
> >
> >
>
>