大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> NET专区 -> WSDL文件详解(转贴)上

WSDL文件详解(转贴)上

时间: 2021-07-31 作者:daque

作家:carlos c. tapanginfotects2001 年 7 月纲要:只有运用 wsdl,即不妨真实不受語言與平台控制的办法,自動為網铁路制服務產生 proxy。(列印共 28 頁)內容运用 wsdl 的因为wsdl 文献結構wsdl 範例檔案定名空間soap 訊息wsdl 類型與訊息區段中的 xml 結構刻画<porttype> 與 <operation> 元素<binding> 與 <operation> 元素文献樣式繫結<service> 與 <port> 元素總結資源运用 wsdl 的因为網路通訊協定之類的標準,究竟是某當權機構強制实行的;或是,人們真的認為,確實按照的優點遠勝於必須开销的代價?歷來所提出的標準,許多都無疾而終。有時候,從未被大眾所运用的標準,法令或当局規定還是硬要运用:比如說,ada 程式語言。我断定,按照標準所能獲得的優點,才是使標準普遍的因为。比方,鐵铁路制服務的重點是,纵然各别公司所创造的列車軌道,也不妨接駁在一道;也即是說,各别公司的產品必須能调整运用。所以,幾家廠商便共通推出了 soap 這個標準。wsdl (web services description language,網铁路制服務刻画語言) 可輕易將網铁路制服務供给廠商與服務的运用者結合起來,輕鬆獲取 soap 的優點。各别公司所创造的列車軌道比較简单调整;畢竟,必須承诺的標準不過是兩條鐵軌之間的距離罢了。但對網铁路制服務而言,情況則複雜得多了。开始必須博得的共識是,指定介面包车型的士標準方法。有個論點从来認為,soap 並不须要介面刻画語言。若 soap 純粹是溝通內容的標準,那麼它须要的便是刻画該內容的語言。soap 訊息確實可傳遞類型資訊,也所以 soap 允許以動態的办法決定類型。但只有领会函數的名稱、參數、與類型,否則基础無法正確呼唤任何函數。若不运用 wsdl,還是不妨從所供给的文献或檢查線路訊息,來確定呼唤的語法。但這兩種办法都须要人工加入,也所以大概在過程中出現錯誤。若运用 wsdl,即不妨真实不受語言與平台控制的办法,自動為網铁路制服務產生 proxy。類似 corba 或 com 的 idl 檔案,wsdl 檔案也是一種客戶端與伺服端之間的合約。請提防,雖然 wsdl 的設計手段是,對 soap 除外的通訊協定顯示繫結;但正文的中心則是在 http 上與 soap 有關連的 wsdl。并且雖然暂时 soap 的重要用处是遠端步调或函數呼唤,但 wsdl 已經不妨在 soap 下,指定傳輸的文献。wsdl 1.1 已經以 note (报告書) 的办法 (請參閱 http://www.w3.org/tr/wsdl.html),提交至 w3c 。wsdl 文献結構若欲瞭解任何 xml 文献,區塊圖是很无助于益的。下圖說明 wsdl 的結構;它是一種 xml 文献,可顯示 wsdl 文献五個組成區段之間的關係。wsdl 文献可分红兩個區段群組。上群組是由笼统定義 (abstract definitions) 所組成;而下群組則是由具體定義 (concrete descriptions) 所組成。笼统區段定義 soap 訊息的办法是,废除平台與語言的控制;所以它們不含任何電腦或語言私有的元素。如许一來,各别的網站皆可實作它所定義的服務。諸如序列化等網站私有的資訊,則交由含具體刻画的下區段處理。笼统定義types (類型)不受電腦與語言控制的類型定義。 messages (訊息)內含函數參數 (輸入與輸出分離) 或文献刻画。 porttypes (埠類型)根據 messages 區段中的訊息定義,說明函數簽章 (作業名稱、輸入參數、輸出參數)。 具體定義bindings (繫結)在 porttypes 區段中,指定每個作業的繫結。 services (服務)指定每個繫結的傳輸埠位址。 鄙人圖中,箭頭連接代办,在文献的各别區段之間有關聯性生存。點與箭頭連接代办「參照」或「运用」關係。雙箭頭連接代办「窜改 (modifier)」關係。3-d 箭頭連接代办「包括 (contains)」關係。所以,messages 區段运用 types 區段的定義;porttypes 區段运用 messages 區段的定義;bindings 區段參照 porttypes 區段;services 區段參照 bindings 區段。porttypes 與 bindings 區段內含作業元素,而 services 區段則內含埠元素。bindings 區段中的作業元素,會窜改或進一步說明 porttypes 區段中的作業元素。以此為基礎,正文將运用標準 xml 技術,說明 wsdl 文献。「元素」一詞是指 xml 元素,而「屬性」一詞則是指元素屬性。所以:<element attribute="attribute-value">contents</element>內容不妨遞迴的办法,由一個之上的元素組成。根元素是最頂端的元素,文献中其它一切元素皆歸在其下。子元素永遠附屬於其它的父元素。請提防,只不妨有一個 types 區段,甚或基础沒有此區段。其它一切區段不妨有零、一、或多個父元素。比方,messages 區段不妨有零、或多個 <message> 元素。wsdl 結構刻画規定,一切區段必須依指定順序陈设:匯入、類型、訊息、porttype、繫結、與服務。每個笼统區段大概各自位於各别的檔案,並分別匯入至主文献中。[圖 1] 笼统與具體定義wsdl 範例檔案現在請一齐深刻探討 wsdl 範例檔案,以檢視其結構與運作办法。請記得這是一個特殊簡單的 wsdl 文献範例。其手段僅在解說最明顯的功效。下列各區段皆有更詳實的討論。<?xml version="1.0" encoding="utf-8" ?><definitions name="foosample"targetnamespace="http://tempuri.org/wsdl/"xmlns:wsdlns="http://tempuri.org/wsdl/"xmlns:typens="http://tempuri.org/xsd"xmlns:xsd="http://www.w3.org/2001/xmlschema"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension"xmlns="http://schemas.xmlsoap.org/wsdl/"><types><schema targetnamespace="http://tempuri.org/xsd" xmlns="http://www.w3.org/2001/xmlschema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"elementformdefault="qualified" ></schema></types><message name="simple.foo"><part name="arg" type="xsd:int"/></message><message name="simple.fooresponse"><part name="result" type="xsd:int"/></message><porttype name="simpleporttype"><operation name="foo" parameterorder="arg" ><input message="wsdlns:simple.foo"/><output message="wsdlns:simple.fooresponse"/></operation></porttype><binding name="simplebinding" type="wsdlns:simpleporttype"><stk:binding preferredencoding="utf-8" /><soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/><operation name="foo"><soap:operationsoapaction="http://tempuri.org/action/simple.foo"/><input><soap:body use="encoded" namespace="http://tempuri.org/message/" encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" /></input><output><soap:body use="encoded" namespace="http://tempuri.org/message/" encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" /></output></operation></binding><service name="foosampleservice"><port name="simpleport" binding="wsdlns:simplebinding"><soap:address location="http://carlos:8080/foosample/foosample.asp"/></port></service></definitions>下列為此範例文献的大概說明。稍後,會就每個區段詳細討論。第一条龙颁布,本文献為 xml。雖然非是需要,但它可協助 xml 领会器決定,應該领会此 wsdl 檔案,或發出錯誤訊號。第二行是 wsdl 文献中的根元素:<definitions>。有幾個定名空間屬性 (定名空間颁布),附屬於此根元素以及 <types> 元素的 <schema> 子元素中。<types> 元素是由 types 區段組成。若無資料類型須要颁布,則此區段不妨简略。在範例 wsdl 中,並無應用程式專屬的類型須要颁布,但還是运用 types 區段,以颁布本文献中結構刻画的定名空間。<message> 元素是由 messages 區段所組成。若將作業視為函數,則 <message> 元素可將參數定義至該函數。<message> 元素中的每個 <part> 子元素,都對應一個參數。請將參數定義輸入至單一的 <message> 元素之中,並與位於本人 <message> 元素中的輸出參數分開。同時是輸入與輸出的參數,在輸入與輸出 <message> 元素中,各有與本人相對應的 <part> 元素。根據慣例,輸出 <message> 元素的名稱,犹如「fooresponse」,會以「response」結束。犹如函數參數需驰名稱與類型一樣,每個 <part> 元素也都驰名稱與類型屬性。若用於文献交換,wsdl 可运用 <message> 元素,說明交換的文献。<part> 元素的類型不妨是,xsd 基礎類型、soap 定義類型 (soapenc)、wsdl 定義類型 (wsdl)、或 types 區段的定義類型。在 porttypes 區段中,不妨有零、一、或更多個 <porttype> 元素。由於笼统的 porttype 定義,可置於各别的檔案中;所以在 wsdl 檔案中,不妨有零個 <porttype> 元素。在上头的範例中,即惟有一個 <porttype> 元素。誠如所見,<porttype> 元素可在 <operation> 元素中,定義一或多個作業。此範例僅顯示一個名為「foo」的 <operation> 元素。此名稱應與函數名稱沟通。<operation> 元素可有一、二、或三個子元素:即 <input>、<output> 與 <fault> 元素。每個 <input> 與 <output> 元素中的訊息屬性,都會參照 messages 區段中的相關 <message> 元素。所以,範例中的整個 <porttype> 元素,相當於下列的 c 函數颁布:int foo(int arg);此範例正足以說明,相較於 c,xml 是多麼冗長的語言。 (囊括 <message> 元素在內,此範例共运用 12 行的 xml 進行函數颁布;而沟通的動作, c 只有一条龙即可。)bindings 區段可有零、一或多個 <binding> 元素。而其手段則是,指定每個 <operation> 呼唤與回應,在線上傳送的办法。services 區段也可有零、一或多個 <service> 元素。它所含的 <port> 元素,每個都參照 bindings 區段中的一個 <binding> 元素。bindings 與 services 區段都是由,wsdl 文献的具體刻画所組成。定名空間在根元素 <definitions> 與子元素 <schema> 中,都有定名空間屬性:<definitions name="foosample"targetnamespace="http://tempuri.org/wsdl/"xmlns:wsdlns="http://tempuri.org/wsdl/"xmlns:typens="http://tempuri.org/xsd"xmlns:xsd="http://www.w3.org/2001/xmlschema"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension"xmlns="http://schemas.xmlsoap.org/wsdl/"><types><schema targetnamespace="http://tempuri.org/xsd" xmlns="http://www.w3.org/2001/xmlschema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"elementformdefault="qualified" ></schema></types>每個定名空間屬性,都會為定名空間颁布一個速記法,再不在文献中运用。比方,「xmlns:xsd」可定義一個速記法 (xsd),代办定名空間 http://www.w3.org/2001/xmlschema。如许一來,稍後即可在文献中參照此定名空間;其办法很簡單,只有在名稱前嵌入字首「xsd」,則「xsd:int」即成為及格的類型名稱。普遍的領域設定規則,皆可套用至此速記字首。也即是說,在一個元素中所定義的字首,僅在該元素中运用。运用定名空間的因为安在?定名空間的手段在制止定名衝突。若我创造了一個網铁路制服務,其 wsdl 檔案中含有一個名為「foo」的元素,而您想要將我的網铁路制服務,與另一個互補性的服務結合起來运用;假如沒有运用定名空間,則另一個網铁路制服務,在其 wsdl 檔案中,便絕對不许运用「foo」這個名稱。只有在兩者的執行個體中,都是指实足沟通的東西,否則這兩個服務不不妨运用沟通的名稱。但若运用兩個各别的定名空間,則我網铁路制服務的「foo」所代办的意義,便與另一個網铁路制服務的「foo」各别。在客戶端,您便必須以嵌入字首 (prefixing 或 qualifying) 的办法,參照我的「foo」。比方,若我颁布 http://www.infotects.com/fooservice 的速記法是 carlos,則 http://www.infotects.com/fooservice#foo 這個实足及格的名稱,不妨等於「carlos:foo」。請提防,若运用 uri 作為定名空間,不只可確保其獨个性,更可允許在文献中运用定址器。uri 所指向的位址,不用對應真实的網路位址。也不妨运用 guid 包办或補充 uri。比方,guid「335db901-d44a-11d4-a96e-0080ad76435d」即是個灵验的定名空間引导項。元素中所颁布的一切名稱,都附屬於 targetnamespace 屬性所颁布的定名空間之下。在 wsdl 範例檔案中,代办 <definitions> 的 targetnamespace 是 http://tempuri.org/wsdl。它所代办的意義是,在此 wsdl 文献中颁布的一切名稱,都附屬於此定名空間。由於 <schema> 元素有它本人的 targetnamespace 屬性,且其值為 http://tempuri.org/xsd;以是在此 <schema> 元素中定義的一切名稱,都是屬於此定名空間,而不屬於主目標定名空間。下一路途式碼位於 <schema> 元素中,它所颁布的是預設的定名空間。結構中一切無嵌入字首 (unqualified ) 的名稱,都屬於此定名空間。xmlns="http://www.w3.org/2001/xmlschema" soap 訊息對运用 wsdl 檔案的客戶端與伺服端而言,它所代办的意義之一是,可決定線上傳送的內容。雖然 soap 运用的是,諸如 ip 與 http 等低層次的通訊協定,但此應用程式卻可決定,一定客戶端與一定伺服端之間所运用的高層次通訊協定。換句話說,若以「echoint」作業為例,运用回波傳回輸入整數,則參數總計、每個參數的類型、與參數傳過線路的办法 (序列化) 等,便會構成一個應用程式私有的通訊協定。指定這類通訊協定的办法很多,但我認為运用 wsdl 才是最好的办法。若就此觀點而言,wsdl 便不不过一種「介面合約」,它更是一種通訊協定指定語言。若胜过了諸如 ip 與 http 等恒定通訊協定的範圍,進入應用程式專屬通訊協定的領域,wsdl 凑巧适合我們所需。wsdl 不妨指定,soap 訊息能否适合 rpc 或文献樣式。正如範例中所运用的一樣,rpc 樣式訊息的外觀就像是,一個有零或多個參數的函數呼唤。文献樣式訊息則較扁平 (flatter) 且不须要那麼多的巢狀階層。下列 xml 訊息的傳送與接受,是运用 ms soap toolkit 2.0 (mstk2) 的 soapclient 物件,领会 wsdl 範例檔案的結果。自客戶端執行函數呼唤「foo(5131953)」:<?xml version="1.0" encoding="utf-8" standalone="no"?><soap-env:envelope soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"><soap-env:body><m:foo xmlns:m="http://tempuri.org/message/"><arg>5131953</arg></m:foo></soap-env:body></soap-env:envelope>伺服端所接受到的 (回應):<?xml version="1.0" encoding="utf-8" standalone="no"?><soap-env:envelope soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"><soap-env:body><soapsdk1:fooresponse xmlns:soapsdk1="http://tempuri.org/message/"><result>5131953</result></soapsdk1:fooresponse></soap-env:body></soap-env:envelope>此函數呼唤訊息與其回應,都是正確灵验的 xml。soap 訊息是由 <envelope> 元素所組成,个中含有一個選擇性的 <header> 元素,與起码一個的 <body> 元素。傳送與接受訊息兩者,在主 <envelope> 元素中,都有只一個 <body> 元素。rpc 函數呼唤訊息的主體,有一個依作業名稱「foo」定名的元素,而回應主體中則有一個名為「fooresponse」元素。這個 foo 元素有個如範例 wsdl 所示的單一引數,其名稱為 <arg>。同樣地,fooresponse 也有一個 <result>。在此處重複出現的 wsdl bindings 區段中,請提防 encodingstyle、封皮、與訊息定名空間的指定办法。<binding name="simplebinding" type="wsdlns:simpleporttype"><stk:binding preferredencoding="utf-8" /><soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/><operation name="foo"><soap:operationsoapaction="http://tempuri.org/action/simple.foo"/><input><soap:body use="encoded" namespace="http://tempuri.org/message/" encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" /></input><output><soap:body use="encoded" namespace="http://tempuri.org/message/" encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" /></output></operation></binding>

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.