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>
?
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.
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.
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.
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:
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With