The schema spec leaves no room for doubt on this issue. Here's an excerpt of the schema element definition:

<schema
attributeFormDefault = (qualified | unqualified) : unqualified
blockDefault = (#all | List of (extension | restriction | substitution)) : ''
elementFormDefault = (qualified | unqualified) : unqualified
finalDefault = (#all | List of (extension | restriction)) : ''
...


The elementFormDefault attribute defaults to "unqualified" if not supplied, meaning that only the global elements and types are namespace qualified.

 - Dennis

Dennis M. Sosnoski
Enterprise Java, XML, and Web Services
Training and Consulting
http://www.sosnoski.com
Redmond, WA  425.885.7197



Dino Chiesa wrote:

Yes !  Ack!

I have seen this before.

When the schema does not declare an elementFormDefault , .NET assumes it is one way, And AXIS assumes it is the other.

This is a bug in one or the other.(I don't know what a schema parser is
expected to do with EFD is missing).


The workaround is to specify elementFormDefault, one way or the other,
in the schema.

Good catch, Anne!




-----Original Message-----
From: Richard Wallis [mailto:[EMAIL PROTECTED] Sent: Friday, March 11, 2005 1:29 PM
To: Anne Thomas Manes
Cc: Dino Chiesa
Subject: RE: Empty namespace - again


Anne,

Please award yourself a gold star! The elementFormDefault="qualified"
solved it, and 18:24 on a Friday night in an empty office after a [very]
long week.  ;-}

I've copied this to Dino for his interest.

Many thanks again,

        Richard.



-----Original Message-----
From: Anne Thomas Manes [mailto:[EMAIL PROTECTED]
Sent: 11 March 2005 18:10
To: Richard Wallis
Subject: Re: Empty namespace - again

I'm surprised that .NET got confused by this, because normally it handles valid schema definitions. Perhaps Dino can shead some light on





it. But here's a work around. Add the elementFormDefault="qualified"
attribute to the scehma definition, which will make the <return> element namespace qualified.


<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" elementFormDefault="qualified">
<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 17:56:50 -0000, Richard Wallis <[EMAIL PROTECTED]> wrote:


Anne,

I did, but it didn't!

Here is my bit of C# built in Visual C#.net pulling in the Web reference of my wsdl as supplied by my Axis server:

static void Main(string[] args)
{
ConsoleApplication1.rjwpc.LookupBorrowerService srv = new ConsoleApplication1.rjwpc.LookupBorrowerService();
String ret = srv.echoString("Hi there");
Console.WriteLine("Response: "+ret); }


It ret is set to null after the echoString() call. Digging


in to the


auto created C# code I get the following:

/// <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.Wrappe


d)
]
[return: System.Xml.Serialization.XmlElementAttribute("return")]
public string echoString(string inputString) {
object[] results = this.Invoke("echoString", new object[] {inputString});
return ((string)(results[0]));
}


The ResponseNamespace="urn:LookupBorrower" makes me wonder


what NS it


is looking for 'return' to be in.
Debug shows 'results' is a one element array with that


element being


null.

I'm getting more confused by the hour.

Richard.

P.S. I'm not too concerned about XMLSpy either!




-----Original Message-----
From: Anne Thomas Manes [mailto:[EMAIL PROTECTED]
Sent: 11 March 2005 17:36
To: Richard Wallis
Subject: Re: Empty namespace - again

I don't understand what XMLSpy is complaining about, but


there are a


number of known errors in XMLSpy. Perhaps it's just complaining because I used the same namespace for both the WSDL and


the schema


(which is acceptable).

But there's nothing wrong with the second point. .NET will not object to the fact that <return> is unqualified, because


that's what


the schema says it should be. .NET was objecting to the fact that the child element of the SOAP Body was unqualified.

Try. You'll see.

Anne


On Fri, 11 Mar 2005 17:01:42 -0000, Richard Wallis <[EMAIL PROTECTED]> wrote:


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













Reply via email to