Defining XML Web Services Operations with WSDL
In this hour, you will learn how WSDL is used to describe XML Web services. You will see how WSDL is used to define how a service exposes itself to various types of HTTP request types. You will also see how the WSDL language is used to inform client applications about argument and return types that are used by the service's methods.
In this hour, we will discuss the following:
Typing in WSDL
Messages
Ports
Bindings
What Is WSDL?
WSDL, or Web Services Description Language, is an XML-based language used to define XML Web services. WSDL describes the service and its methods as well as the manner in which communication between a client and a service should be carried out.
A WSDL Document Example
In order to get a grasp of how WSDL works, one must first look at a WSDL document. The following document describes a service, WSDLTester, that contains one method, TestMethod1. This method accepts as its arguments an integer named iNum1 and a Boolean named fBool1 and returns a string.
Listing 3.1 WSDL Document for Service WSDLTester
1: <?xml version="1.0" encoding="utf-8"?> 2: <definitions xmlns:s="http://www.w3.org/2001/XMLSchema" 3: xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 4: pxmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 5: pxmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 6: xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 7: pxmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 8: xmlns:s0="http://tempuri.org/" targetNamespace="http://tempuri.org/" 9: xmlns="http://schemas.xmlsoap.org/wsdl/"> 10: <types> 11: <s:schema attributeFormDefault="qualified" elementFormDefault="qualified" 12: targetNamespace="http://tempuri.org/"> 13: <s:element name="TestMethod1"> 14: <s:complexType> 15: <s:sequence> 16: <s:element minOccurs="1" maxOccurs="1" 17: name="iNum1" type="s:int" /> 18: <s:element minOccurs="1" maxOccurs="1" 19: name="fBool1" type="s:boolean" /> 20: </s:sequence> 21: </s:complexType> 22: </s:element> 23: <s:element name="TestMethod1Response"> 24: <s:complexType> 25: <s:sequence> 26: <s:element minOccurs="1" maxOccurs="1" 27: name="TestMethod1Result" nillable="true" type="s:string" /> 28: </s:sequence> 29: </s:complexType> 30: </s:element> 31: <s:element name="string" nillable="true" type="s:string" /> 32: </s:schema> 33: </types> 34: <message name="TestMethod1SoapIn"> 35: <part name="parameters" element="s0:TestMethod1" /> 36: </message> 37: <message name="TestMethod1SoapOut"> 38: <part name="parameters" element="s0:TestMethod1Response" /> 39: </message> 40: <message name="TestMethod1HttpGetIn"> 41: <part name="iNum1" type="s:string" /> 42: <part name="fBool1" type="s:string" /> 43: </message> 44: <message name="TestMethod1HttpGetOut"> 45: <part name="Body" element="s0:string" /> 46: </message> 47: <message name="TestMethod1HttpPostIn"> 48: <part name="iNum1" type="s:string" /> 49: <part name="fBool1" type="s:string" /> 50: </message> 51: <message name="TestMethod1HttpPostOut"> 52: <part name="Body" element="s0:string" /> 53: </message> 54: <portType name="WSDLTesterSoap"> 55: <operation name="TestMethod1"> 56: <input message="s0:TestMethod1SoapIn" /> 57: <output message="s0:TestMethod1SoapOut" /> 58: </operation> 59: </portType> 60: <portType name="WSDLTesterHttpGet"> 61: <operation name="TestMethod1"> 62: <input message="s0:TestMethod1HttpGetIn" /> 63: <output message="s0:TestMethod1HttpGetOut" /> 64: </operation> 65: </portType> 66: <portType name="WSDLTesterHttpPost"> 67: <operation name="TestMethod1"> 68: <input message="s0:TestMethod1HttpPostIn" /> 69: <output message="s0:TestMethod1HttpPostOut" /> 70: </operation> 71: </portType> 72: <binding name="WSDLTesterSoap" type="s0:WSDLTesterSoap"> 73: <soap:binding 74: transport="http://schemas.xmlsoap.org/soap/http" 75: style="document" /> 76: <operation name="TestMethod1"> 77: <soap:operation soapAction="http://tempuri.org/TestMethod1" 78: style="document" /> 79: <input> 80: <soap:body use="literal" /> 81: </input> 82: <output> 83: <soap:body use="literal" /> 84: </output> 85: </operation> 86: </binding> 87: <binding name="WSDLTesterHttpGet" type="s0:WSDLTesterHttpGet"> 88: <http:binding verb="GET" /> 89: <operation name="TestMethod1"> 90: <http:operation location="/TestMethod1" /> 91: <input> 92 <http:urlEncoded /> 93: </input> 94: <output> 95: <mime:mimeXml part="Body" /> 96: </output> 97: </operation> 98: </binding> 99: <binding name="WSDLTesterHttpPost" type="s0:WSDLTesterHttpPost"> 100: <http:binding verb="POST" /> 101: <operation name="TestMethod1"> 102: <http:operation location="/TestMethod1" /> 103: <input> 104: <mime:content type="application/x-www-form-urlencoded" /> 105: </input> 106: <output> 107: <mime:mimeXml part="Body" /> 108: </output> 109: </operation> 111: </binding> 112: <service name="WSDLTester"> 113: <port name="WSDLTesterSoap" binding="s0:WSDLTesterSoap"> 114: <soap:address 115: location="http://localhost/WebService3/WSDLTester.asmx" /> 116: </port> 117: <port name="WSDLTesterHttpGet" binding="s0:WSDLTesterHttpGet"> 118: <http:address 119: location="http://localhost/WebService3/WSDLTester.asmx" /> 120: </port> 121: <port name="WSDLTesterHttpPost" binding="s0:WSDLTesterHttpPost"> 122: <http:address 123: location="http://localhost/WebService3/WSDLTester.asmx" /> 124: </port> 125: </service> 126: </definitions>
Analysis of WSDL Document Example
Let's take a moment to analyze the code example above to ensure you understand the various elements that are taking place here.
Types (lines 10 through 33)Provides data type definitions that will be used for communication between the XML Web Service and its clients.
Messages (lines 34 through 53)Provides a message name, associated with a type, that will be used for communication.
PortTypes (lines 54 through 71)Associates specific messages with port types, such as HttpPost.
Bindings (lines 72 through 111)Binds specific ports and XML Web service methods to Internet protocols, such as SOAP.
Services (lines 112 through 125)Supplies the address information for a service's different ports of communication.
Note
WSDL documents are fairly complex and can be extremely confusing to anyone who isn't accustomed to them and, for that reason, Visual Studio/ .NET generates a WSDL document for every XML Web Service that you create. The purpose of this hour is to help you understand what an XML Web Service does based on its WSDL document. Do not worry about memorizing all of the rules and syntax that comprise WSDL as you will probably never be forced to make changes to a WSDL document.