WSDL文檔可以分為兩部分。
頂部分由抽象定義組成,而底部分則由具體描述組成。抽象部分以獨立于平臺和語言的方式定義SOAP消息,它們并不包含任何隨機器或語言而變的元素。這就定義了一系列服務,截然不同的網站都可以實現。隨網站而異的東西如序列化便歸入底部分,因為它包含具體的定義。
l 抽象定義
Types
獨立與機器和語言的類型定義
Messages
包括函數參數(輸入與輸出分開)或文檔描述
PortTypes
引用消息部分中消息定義來描述函數簽名(操作名、輸入參數、輸出參數)
2 具體定義
Bindings
PortTypes部分的每一操作在此綁定實現
Services
確定每一綁定的端口地址
下面的圖中,箭頭連接符代表文檔不同欄之間的關系。點和箭頭代表了引用或使用關系。雙箭頭代表"修改"關系。3-D的箭頭代表了包含關系。這樣,各Messages欄使用Types欄的定義,PortTypes欄使用Messages欄的定義;Bindings欄引用了PortTypes欄,Services欄引用Bindings欄,PortTypes和Bindings欄包含了operation元素,而Services欄包含了port元素。PortTypes欄里的operation元素由Bindings欄里的operation元素進一步修改或描述。

首先看看一段簡單的JAVA代碼,我們用它作為WSDL的服務實現代碼:

public class Test
{

public String echo(String u)
{
return "Hello " + u;
}
}

看看它導出的文件:
消息傳遞和傳輸:我以一種抽象方式定義了操作和消息,而不考慮實現的細節。實際上,WSDL 的任務是定義或描述 Web 服務,然后提供一個對外部框架的引用來定義 WSDL 用戶將如何實現這些服務。可以將這個框架當作 WSDL 抽象定義和它們的實現之間的“
綁定( binding
)”。
當前,最流行的綁定( binding
)技術是使用簡單對象訪問協議(SOAP)。WSDL 將指定能夠訪問 Web 服務實際實現的 SOAP 服務器,并且從那時起 SOAP 的整個任務就是將用戶從 WSDL 文件帶到它的實現。
每個namespace屬性都聲明了一個縮略語,用在文檔中。例如"xmlns:xsd"就為 http://www.w3.org/2001/XMLSchema定義了一個縮略語(xsd)。這就允許對該namespace的引用只需簡單的在名字前加上前綴就可以了,如:"xsd:int"中的"xsd"就是合法的類型名。普通范圍規則可運用于縮略前綴。也就是說,前綴所定義的元素只在元素中有效。
Namespace派什么用?namespace的作用是要避免命名沖突。如果我建立一項Web Service,其中的WSDL文件包含一個名為"foo"的元素,而你想要使用我的服務與另一項服務連接作為補充,這樣的話另一項服務的WSDL文件就不能包含名為"foo"的元素。兩個服務器程序只有在它們在兩個事例中表示完全相同的東西時,才可以取相同的名字。如果有了表示區別的namespace,我的網絡服務里的"foo"就可以表示完全不同于另一個網絡服務里"foo"的含義。在你的客戶端里,你只要加以限制就可以引用我的"foo"。
見下例:http://www.infotects.com/fooService#foo 就是完全限制的名字,相當于"carlos:foo",如果我聲明了carlos作為http://www.infotects.com/fooService的快捷方式。請注意namespace中的URL是用來確定它們的唯一性的,同時也便于定位。URL所指向的地方不必是實際存在的網絡地址,也可以使用GUID來代替或補充URL。例如,GUID"335DB901-D44A-11D4-A96E-0080AD76435D"就是一個合法的namespace指派。
targetNamespace屬性聲明了一個namespace,元素中所有的聲明的名字都列于其內。在WSDL示例中,<definitions>的targetNamespace 是http://tempuri.org/wsdl。這意味著所有在WSDL文檔中聲明的名字都屬于這個namespace。<schema>元素有自己的targetNamespace屬性,其值為 http://tempuri.org/xsd ,在<schma>元素中定義的所有名字都屬于這個namespace而不是main的target namespace。
<schema>元素的以下這行聲明了默認的namespace。Schema中所有有效的名字都屬于這個namespace。