Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between Type and Element in WSDL?

Tags:

wsdl

schema

In WSDL file a function can return a Type or an Element. I have used only custom types as a results so far. However, I wonder when the Element should be more appropriate than the Type? What is the difference between them?

Is there any difference between

<wsdl:message name="MyFunction">     <wsdl:part name="parameters" element="tns:Person"></wsdl:part> </wsdl:message> 

and

<wsdl:message name="MyFunction">     <wsdl:part name="parameters" type="tns:Person"></wsdl:part> </wsdl:message> 

from a Client perspective (application that uses the web service)?

The above question, as skaffman pointed, leads to a another question. What is the difference between

<xs:element name="Person" ... >  ... </xs:element> 

and

<xs:complexType name="Person">    ... </xs:complexType> 

?

like image 883
czuk Avatar asked Jul 23 '09 14:07

czuk


People also ask

What is type in WSDL?

Types are XML documents, or document parts. The types element describes all the data types used between the client and the server. WSDL is not tied exclusively to a specific typing system. WSDL uses the W3C XML Schema specification as its default choice to define data types.

What are the different elements of WSDL documents?

WSDL Document Elements A WSDL document has a definitions element that contains the other five elements, types, message, portType, binding and service. The following sections describe the features of the generated client code.

What does definition element define in WSDL?

WSDL - <definition> Element is a container of all the other elements. specifies that this document is called HelloService. specifies a targetNamespace attribute. The targetNamespace is a convention of XML Schema that enables the WSDL document to refer to itself.


1 Answers

There's more to it than that.

There is some ambiguity in the standards that can cause interoperability problems. You have to use type or element depending on whether you're using a Document-based service or an RPC-based service.

There are also ambiguities. If you say

<wsdl:message name="message1" type="ns:type1"/> 

Then you've said that the content of the message must validate against type "ns:type1". But you've said nothing about the element that contains the content. What namespace will it be in?

Refer to the WS-I Basic Profile for some rules on this.


There's been some discussion in the comments about "document/literal" vs. "document/literal/wrapped". Here's my take.

I just created a web service. Here's the whole thing:

using System.Web.Services;  namespace WebService1 {     [WebService(Namespace = "http://tempuri.org/")]     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]     [System.ComponentModel.ToolboxItem(false)]     public class SimpleMathService : WebService     {         [WebMethod]         public int Add(int a, int b)         {             return a + b;         }          [WebMethod]         public int Multiply(int a, int b)         {             return a*b;         }     } } 

I won't post the entire WSDL, but here are the "good parts":

<?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema"      xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"       targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" >     <wsdl:types>         <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">             <s:element name="Add">                 <s:complexType>                     <s:sequence>                         <s:element minOccurs="1" maxOccurs="1" name="a" type="s:int"/>                         <s:element minOccurs="1" maxOccurs="1" name="b" type="s:int"/>                     </s:sequence>                 </s:complexType>             </s:element>             <s:element name="AddResponse">                 <s:complexType>                     <s:sequence>                         <s:element minOccurs="1" maxOccurs="1"                             name="AddResult" type="s:int"/>                     </s:sequence>                 </s:complexType>             </s:element>             <s:element name="int" type="s:int"/>         </s:schema>     </wsdl:types>     <wsdl:message name="AddSoapIn">         <wsdl:part name="parameters" element="tns:Add"/>     </wsdl:message>     <wsdl:message name="AddSoapOut">         <wsdl:part name="parameters" element="tns:AddResponse"/>     </wsdl:message>     <wsdl:portType name="SimpleMathServiceSoap">         <wsdl:operation name="Add">             <wsdl:input message="tns:AddSoapIn"/>             <wsdl:output message="tns:AddSoapOut"/>         </wsdl:operation>     </wsdl:portType>     <wsdl:binding name="SimpleMathServiceSoap" type="tns:SimpleMathServiceSoap">         <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>         <wsdl:operation name="Add">             <soap:operation soapAction="http://tempuri.org/Add" style="document"/>             <wsdl:input>                 <soap:body use="literal"/>             </wsdl:input>             <wsdl:output>                 <soap:body use="literal"/>             </wsdl:output>         </wsdl:operation>     </wsdl:binding>     <wsdl:service name="SimpleMathService">         <wsdl:port name="SimpleMathServiceSoap" binding="tns:SimpleMathServiceSoap">             <soap:address location="http://localhost:5305/SimpleMathService.asmx"/>         </wsdl:port>     </wsdl:service> </wsdl:definitions> 

Note how the word "wrapped" does not appear. What IBM in their document is calling "document/literal/wrapped" is simply "document/literal", that happens to use a single message part, that happens to have a name derived from the name of the service, and that happens to refer to an element, and which happens to contain both the parameters to the operation.

There's nothing magical here, there's nothing non standard here.

In many standards organizations companies wind up taking sides. In the case of SOAP, we've got the "RPC side" and the "Document side". RPC is more familiar to many people - it maps one to one with a function call. Document is less familiar, and requires that you actually think in terms of simple XML. Perhaps IBM was on the RPC side, I don't know.


I have now finished the IBM document, Which style of WSDL. The summary is:

Summary

There are four binding styles (there are really five, but document/encoded is meaningless). While each style has its place, under most situations the best style is document/literal wrapped.


I also want to react to the places in the document where it discusses the level of difficulty in dispatching, based on whether the operation name is present in the message. This is a non-issue. If you read the document, you'll note that it never discusses anything in the <binding> section. The solution to the "no operation name" problem is there.

<wsdl:binding name="SimpleMathServiceSoap" type="tns:SimpleMathServiceSoap">     <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>     <wsdl:operation name="Add">         <soap:operation soapAction="http://tempuri.org/Add" style="document"/> 

The soapAction is sent in the HTTP headers of the request, and can be used for dispatching:

POST /SimpleMathService.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/Add"  <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xmlns:xsd="http://www.w3.org/2001/XMLSchema"         xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">   <soap:Body>     <Add xmlns="http://tempuri.org/">       <a>int</a>       <b>int</b>     </Add>   </soap:Body> </soap:Envelope> 
like image 187
John Saunders Avatar answered Oct 20 '22 07:10

John Saunders