網絡服務(Web Service)是基于網絡的分布式應用程序的基本構造模塊,而這些程序是以平臺、對象模板和多語言方式構建的。建立在象HTTP和XML之類的開放的Internet 標準之上的,并且由此形成了可編程網絡理念的基礎。
圖1 網絡服務應用模
這篇文章詳細講述網絡服務以及為其提供支持的技術,這些技術能確保服務被集成到應用程序里去。同時本文將講述新的Microsoft.NET框架及其對生成和使用網絡服務的支持。
現在開發中最緊迫的問題是應用程序的集成化:運行在不同操作系統上的不同的應用程序,通常是由不同編程語言對象模板建立的,獲取這些程序然后把它們轉化為易于使用的網絡應用程序。建立在象HTTP和XML之類開放的網絡標準之上的網絡服務接受了這項挑戰。
但是只支持標準協議是不夠的,我們必須有途徑來生成、部署、擴展和維護這些網絡服務,這正是Microsoft.NET框架要解決的問題。
圖2 Microsoft.NET Framework體系結構
下面筆者將介紹網絡服務及Microsft.NET框架的組件,包括通用運行語言(Common Language Runtime)、服務框架和用于建立、集成網絡服務的程序模板。
網絡服務一覽
通常說來,網絡服務只是一個作為服務發行的簡單應用程序。換句話說,它是可通過URL定位的自動將信息返回到需要它的客戶端那里的一種資源。網絡服務一個重要的特點是客戶不需要知道一種服務是怎樣實現的。在本文中,筆者將向你解釋網絡及網絡服務如何把基于組件技術的最好的方面結合在一起,并且介紹與網絡服務通信所需的基本框架。
同組件一樣,網絡服務提供“黑匣子”函數,它可以被多次用而不用關心此服務是怎樣實現的。網絡服務還提供被稱為契約的精確定義的接口,此接口描繪了所提供的服務。開發人員可以將遠程服務、本地服務和定制代碼組合在一起集成到應用程序中。例如,某公司可以使用如下服務組建一個在線商店:微軟護照(Passport)服務用來驗證用戶身份、第三方個人化服務用來使網頁匹配每一個用戶的參數、信用卡處理服務、銷售稅服務、對每個運輸公司的包裹跟蹤服務,鏈接公司內部庫存管理程序的內部目錄服務以及少量定制代碼,以使他們的商店能脫穎而出。圖1顯示的模型說明了為生成分布式網絡應用程序應怎樣鏈接網絡服務。
然而,網絡服務與現在的組件技術并不相同,它不使用需要在服務器和客戶機有明確的、同類型基本構架的具體對象模型協議,例如DCOM、RMI或IIOP。盡管與具體組件技術緊密結合的實現在一個受控的環境中能很好地被接受,但它們在網絡環境中變得不切實際。因為一個集成商業程序的參與者會發生變化,隨著時間的推移,技術也在變化,所以在所有參與者間確保一個單一的、統一的體系架構就變得十分困難。網絡服務采取了另外一種途徑,它使用普便存在的網絡協議和數據格式進行通信,如HTTP和XML。支持這些網絡標準的任何系統都支持網絡服務。
而且,網絡服務契約描述的是以術語報文形式提供的服務,這些服務是由網絡服務生成和接受的,而并不描述服務是如何實現的。通過把重點放在報文上,網絡服務模板對語言、平臺和對象模板變得完全透明。這樣,用任何一套編程語言、對象模型和平臺的完全特性集,都可實現網絡服務。網絡服務可以在任何平臺上,被任何應用程序所使用。只要用于解釋服務容量、報文序列和所期望協議的契約得到認同,那么所實現的網絡服務及網絡服務用戶就可相互不同,而不會影響會話另一端的應用程序。
網絡服務模板對最小體系架構的要求很低,目的是確保網絡服務在使用任何技術和編程語言的平臺上實現和訪問。對網絡服務互用性的解決可以只依靠網絡標準。然而,為了使應用程序更容易使用網絡服務,簡單地通過標準網絡協議訪問網絡服務是不夠的。當網絡服務和網絡服務使用者依靠標準的方式(如XML)表示數據和命令、表示網絡服務契約、算出網絡服務所提供的容量時,網絡服務才會更加容易使用。
XML是定義一個標準的、可擴展的用于提供命令和典型數據的語言的明智選擇。雖然為表示命令和典型數據可以定義使用其它技巧(比如編碼為一種查詢字符串)的規則,但XML被專門設計為描述數據的標準元語言。簡單對象存取協議(SOAP)是以一種可擴展的方式使用XML表示數據和命令的工業標準。網絡服務可選擇用SOAP決定報文的格式。
XML是網絡服務契約的一種常用技術。服務契約語言(SCL)是記錄網絡服務契約的XML語法。由于SCL是基于XML的,所以對開發者和開發工具來說,它更容易生成并解釋契約。
圖3 Services Framework類庫
Disco規范為服務提供者發布網絡服務契約和相應的機制描述了一個標準方式,這將使開發者或開發工具可找到契約文獻。
象SOAP、SCL和Disco這樣的標準有助于開發者,因為它們不需要明白和實現所使用的每一個網絡服務的訪問方式。支持這些標準的更好的、已充分測試的、高性能的體系架構將由開發平臺提供,這會大大簡化整個開發過程。
Microsoft.NET Framework
Microsoft.NET框架的目的是使你更容易建立網絡應用程序和網絡服務。圖2顯示了Microsoft.NET框架的體系結構。建立在操作系統最上層的服務,是管理運行代碼需求的Common Language Runtime,這些代碼可以用任何現代編程語言所編寫。Runtime提供了許多服務,這些服務有助于簡化代碼開發和應用程序的開發,同時也將提高應用程序的可靠性。.NET Framework包括一套可被開發者用于任何編程語言的類庫。在此之上是許多應用程序模板,這些模板為開發網絡站點和網絡服務提供了高級組件和服務,下面筆者將逐層描述。
Common Language Runtime
運行語言(Runtime)可以調用并運行任何編程語言所寫的代碼。以運行為目標的代碼被稱為受控(Managed)代碼,受控代碼只是意味著在內部可執行代碼與自身代碼存在已經定義好的合作契約。對于生成對象、調用方法等這樣的任務,被委托給了運行語言,這使得運行語言能為可執行代碼增加額外的服務。
運行語言具有交叉語言集成、自描述組件、簡單配制、版本化以及集成安全服務等特點。
運行語言使用一種能表達大部分現代編程語言語義的通用類型系統,該通用類型系統定義了一套標準類型及生成新標準的規則。運行語言知道怎樣生成、執行這些類型。編譯器和解釋器使用運行語言服務來定義類型、管理對象、進行方法調用。
類型系統的主要設計目的是使多種語言能深度集成。用一種語言所寫的代碼能繼承用另一種語言所寫的類,用一種語言所寫的代碼拋出的異常能被用另一種語言寫的代碼所捕獲,象調試之類的操作會在完全封閉下進行,而不用考慮代碼編寫所用的語言。這就意味著編寫可重用類庫的開發者,不再需要為每一種編程語言或編譯器生成一個版本,并且使用類庫的開發者也將不再受到他們所使用的編程語言開發庫的限制。
自描述組件簡化了開發和配制,并提高了系統的可靠性。許多由運行語言提供的服務是由元數據及用于補充可執行代碼的信息所驅動。因為所有的信息都儲存在一起,只有可執行的代碼才被稱為自描述組件。
自描述組件的一個主要優點是,使用它們并不需要其它文件。類的定義不需要單獨的頭文件;通過檢查元數據對類的定義可以從組件自身獲得?缯Z言或過程邊界訪問組件并不需要各自的IDL文件、類型文件或proxy/stubs;所必需的信息已存在于元數據之中。最主要的是,由于元數據是在編譯過程中由源代碼生成,并與可執行代碼儲存在一起,因此,它將永遠和可執行部分同步。
除了改善對單個組件的配置,Microsft .NET框架定義了一個應用程序配置模板,以解決定制應用程序安裝和DLL版本化(通常被稱為“DLL Hell”)這一復雜過程的問題,運行語言提供了支持這個模板的服務。
Microsft.NET框架引入了組合體的概念。一個組合體是一組資源和類型,并包括有關這些資源和類型的元數據,也就是被作為一個單元配置的。元數據被稱為組合體的名單,它包含象類型和資源表之類能被組合體外看得見的信息,這個名單也包括有關從屬關系之類的信息,例如組合體建立時的版本號。開發人員可以指定版本策略,以指示運行語言是否裝入系統上已安裝的依賴于組合體的最新版本,裝入一指定版本,或在編譯時使用的版本。
某軟件組件的多個拷貝可以存在于同樣的操作系統上,然而,通常只有其中的一個拷貝能被操作系統注冊、調入內存并執行。對系統來說,定位和調入內存的策略是全局性的。.NET Framework Common Language Runtime增加了所必須的體系架構以支持管理組件定位和調入的每個應用程序策略,這通常被稱為并行配置。
組合體可以被一個應用程序私有,或被多個應用程序共享。一個組合體的多個版本可以同時配置在同一臺機器上。應用程序的配置信息定義了應到何處去查找組合體,這樣,Runtime就能為同時運行的兩個不同的應用程序裝入到同一組合體的不同版本中,消除了由組件版本的不兼容性引起的問題,提高了系統整體的穩定性。如果必要,管理員可以為配置時的組合體增加配置信息。
因為組合體是自描述的,所以并不需要在系統上進行注冊。應用程序的配置簡單到了只需將文件拷貝到目錄中即可(如果為了使應用程序能夠運行,必須安裝未經組織過的組件的話,情況會稍微復雜一點)。配置信息保存在可被任何文本編輯器編輯的XML文件中。
最后,運行語言也提供完整的、普遍深入的安全服務,以確保未經授權的用戶不能訪問機器上的資源,并且代碼不會執行未經允許的動作。這就提高了系統整體的安全性和可靠性。由于運行語言用于裝入代碼、生成對象、執行方法調用,所以當受控代碼裝入內存并執行時,運行語言能進行安全檢查,從而強化安全策略。
Microsft.NET框架不僅規定代碼訪問安全機制,還規定基于角色的安全機制。通過代碼訪問安全機制,開發人員能為應用程序指定完成工作所必需的權限。例如,程序或許需要寫文件或訪問環境變量的權力。這類信息和有關代碼標志的信息一起存儲在配置級上。當代碼裝入內存并執行方法調用時,運行語言將驗證是否能給予代碼所要求的權限。如果不能,將記錄一條安全沖突信息。給予權限的策略,被稱之為信任策略,是由系統管理員建立的,并且是建立在關于代碼的證據基礎之上。比如:代碼是誰發布的,是從什么地方獲得的,以及在組合體中找到的代碼標志和它要求的權限。開發人員可以指定他們具體的權限,以防止其它人惡意使用他們的代碼。如果所需要的權限依賴直到運行時刻才會知道的信息,那么就可寫入綱領性的安全檢查。
除了代碼訪問安全機制,運行語言還支持基于角色的安全機制;诮巧陌踩珯C制建立同代碼訪問安全機制一樣的權限模板,只是這些權限是建立在用戶的身份之上,而不是建立在代碼的標志之上。角色表明了用戶所屬的類,并且可以在開發和配置階段定義。給予權限的策略被分配到每個預定義的角色。在運行時刻,用戶的身份被確定,代碼將代表這個身份運行。運行語言決定用戶是哪個角色的成員,然后給予基于這個角色的權限。
在查看Microsft.NET框架的可編程模板前,先看一下它所提供的服務。
服務框架
正如我們從圖2所看到的那樣,在Common Language Runtime之上是服務框架(Services Framework),此框架提供能被任何現代編程語言所調用的類。所有的類都遵循一套命名和設計方針,從而大大減小了開發人員學習過程中的難度。
圖3顯示了服務框架中的一些主要類庫?蚣馨ㄒ惶组_發人員希望在標準語言庫中存在的基類庫,例如:集合、輸入/輸出、字符串及數據類。另外,基類庫提供訪問操作系統服務如圖畫、網絡、線程、全球化和加密的類。服務框架也包括數據訪問類庫及開發工具,如調試和剖析服務等。
數據訪問服務
幾乎所有的網絡服務都需要查詢和更新永久性數據,不論是以簡單文件,還是以相關數據庫,或是以其它的存儲類型存在。為了提供對數據的訪問,服務框架包括ActiveX Data Objects+ (ADO+)類庫。如同名字所暗示的那樣,ADO+由ADO發展而來。ADO+為基于網絡的應用程序和服務提供數據訪問服務。圖1闡明了ADO+的體系結構,表明任何數據,不論這些數據實際上如何存儲的,都以XML或相關數據的格式被操作。
ADO+定義了那些鏈接數據倉庫、對數據倉庫發送命令及從中獲取結果的類。這些類由受控數據提供者(managed data provider)實現。ADO+中鏈接和命令對象看上去和ADO中的是一樣的,并且一個名為DataReader的新類提供了通過高性能API流獲取結果的能力。DataReader在功能上與ADO的記錄集(Recordset)是相似的,但是DataReader被設計用來最小化內存中生成的對象的數量,用以提高性能、避免垃圾積累。在.NET Framework中包含了針對Microsoft SQL Server的受控數據提供者以及可通過OLE DB訪問的任何數據倉庫。
ADO+的一個主要創新是引入了數據集(Dataset)。一個數據集是內存中提供數據關系圖的高速緩沖區。數據集對數據源一無所知,它們可以由程序或通過從數據倉庫中調入數據而被生成、填充。不論數據從何處獲取,數據集都是通過使用同樣的程序模板而被操作的,并且它使用相同的數據緩沖區。使用.NET平臺的開發人員能夠用數據集代替傳統ADO中無連接的記錄集。
受控數據提供者為數據倉庫和數據集公開的、名為DataSetCommand的接口對象。DataSetCommand使用ADO+鏈接和命令從數據倉庫中提取數據集,并把在數據集中發生的變化解析到數據倉庫中。
就像DataReaders顯示了對于相關數據的有效的流訪問一樣,XmlReaders顯示了對XML數據的流訪問。開發人員使用DataNavigator可以滾動和編輯內存中的XML文檔。DataNavigator在功能上和Document Object Model (DOM)是一樣的,但它更有效,并提供了能很好映射關系數據表的對象模板。ADO+為那些希望繼續使用DOM作為XML對象模板而不是使用更有效的DataNavigator模板的開發人員提供了一個XMLDocument類。
圖4 ADO+體系結構
表單應用模板
從概念上講,在服務框架的最上面是兩個應用程序模板:Windows表單應用模板和網絡應用程序模板。盡管本文把重點放在把Microsft.NET框架用作開發網絡服務和網絡應用程序的一種途徑上,但框架也可用于開發較傳統的基于Windows的應用程序(當然,這些應用程序也能使用網絡服務)。
編寫Windows客戶應用程序的開發人員可使用Win表單應用程序模板以利用Windows豐富的用戶接口特點,包括現在的ActiveX控件和Windows 2000的新特點,如透明的、分層的浮動窗口。開發人員會發現Win表單可編程模板和對設計階段的支持非常直觀。
Win表單利用了Microsft.NET框架 runtime以減少基于Windows的客戶應用程序的開銷。只要應用程序和組件是用于Win表單應用程序的,那么它們就能被框架安全模板在客戶機上安全地執行。
Microsft.NET框架裝配模板簡化了應用程序的配制和版本化。應用程序可被配制為使用它們在編譯和測試中所用的共享組件,而不是使用恰好在客戶機器上安裝的隨便什么版本的組件,這就提高了應用程序的可靠性,減少了應用程序所支持調用的主要因素:用戶接口控件和其它共享組件版本的不兼容性。
網絡應用程序模板
建立在Microsft.NET框架上網絡應用程序共享一個通用應用程序模板。包含用于生成在瀏覽器中觀看的網頁的網絡應用程序和網絡服務。下面,筆者將詳細介紹Active Server Pages+ (ASP+)的網絡應用程序可編程模板,如圖2所示。
ASP+是由活動服務器頁面(ASP)發展而來。ASP+利用common language runtime和服務框架網絡應用程序提供了一個可靠的、自動化的、可擴展的主機環境。ASP+也受益于common language runtime集成模板,簡化了應用程序的配制。另外,它提供簡化應用程序開發的服務(如狀態管理服務)以及高水平的編程模板(如ASP+網絡表單和ASP+網絡服務)。
ASP+的核心是HTTP運行語言,一個高性能的用于處理基于低級結構的HTTP請求的運行語言,而基于的結構與Microsoft Internet Information Services (IIS)所提供的ISAPI結構相似。由圖2可知,HTTP運行語言(HTTP runtime)負責處理引入的所有HTTP請求,并對每個請求應用程序的URL進行解析,然后把請求分配到應用程序以進行進一步的處理。HTTP 運行語言是多線程的,并異步處理請求,因此劣質的應用程序代碼阻礙不了它對新請求的處理。而且HTTP運行語言假定失敗必會發生,因此它通?梢宰詣拥貜脑L問沖突、內存泄漏、死鎖等事故中恢復過來。
ASP+使用基于構件的Microsft .NET框架配制模板,因此它獲得了如XCOPY配制、構件并行配制、基于XML配制等優點。ASP+另一個主要優點是,它支持應用程序的實時更新。管理員不必關掉網絡服務器,甚至不用停止應用程序的運行就可以更新應用文件。應用程序文件永遠不會被加鎖,甚至在程序運行時文件就可以被覆蓋。當文件更新后,系統會檢測到文件變化,并用新的應用程序代碼建立一個新的應用程序實例,然后將引入的請求傳遞到應用程序。當所有被現存的應用程序實例處理的未完成的請求處理完后,該實例就被銷毀。
在應用程序中,HTTP請求(HTTP Request)通過HTTP模塊的管道路由,最終到達請求處理程序。HTTP模塊和請求處理程序是一些實現特殊接口的受控類,而這些接口是由ASP+定義的。這種管道結構使得為應用程序增加服務非常方便:只需補充一個HTTP模塊。例如安全、狀態管理及跟蹤都被實現為HTTP模塊。高級可編程模塊,如網絡服務和網絡表單,通常被用于請求處理程序。一個應用程序能鏈接多個請求處理程序,每個處理程序對應一個URL,但是所有的HTTP請求都要通過同樣的管道路由。
網絡基本上是一個無狀態模型,并且在HTTP請求間沒有聯系,這使得編寫網絡應用程序很困難,因為應用程序通常需要維護跨多個請求的狀態。ASP+增強了由ASP引入的狀態管理服務,以便為網絡應用程序提供三種類型的狀態:應用程序、會話和用戶。就像在ASP中一樣,應用程序狀態特定于一個應用程序實例,并且不會持久。會話狀態是特定于一個用戶與應用程序間的會話的。與ASP會話狀態不同,ASP+會話狀態儲存在一個獨立的過程中,并且可把它配制成可以儲存到一個獨立的機器上。這使得會話狀態當應用程序在網絡群(Web farm)擴展時非常有用。用戶狀態類似于會話狀態,但通常它不會超時,并且是永久性的。因此,用戶狀態對儲存用戶參數和其它個性化的信息是有用的。所有狀態管理服務都被實現為HTTP模塊,因此它們容易增加到應用程序管道中,或從中刪除。
圖5 ASP+網絡應用模型
如果除了由ASP+提供的服務外,還需要額外的狀態管理服務,那么可由第三方的模塊提供。
ASP+同樣提供高速緩沖服務,以改善性能。輸出緩沖可完全節省網頁翻譯,段緩沖儲存部分的網頁。由于提供了相應的類,所以只要需要,應用程序、HTTP模塊以及請求處理程序就可以在高速緩存中儲存任意數量的對象。
下面讓我們認識一下建立在ASP+可編程模塊之上的兩個高級可編程模塊:ASP+網絡表單和ASP+網絡服務。
ASP+網絡表單
網絡表單把基于Visual Basic表單的高生產性優點帶到了網絡應用程序的開發中來。網絡表單支持傳統的將HTML內容與腳本代碼混合的ASP語法,但是它提出了一種將應用程序代碼和用戶接口內容分離的更加結構化的方法。引入的網絡表單控件用于為封裝通用用戶接口元素提供了一種機制。這些新的特點使得開發工具在支持VB小應用程序的同時,也支持設計模塊。
圖3 ASP+網絡服務
網絡表單控件負責生成用戶接口,典型情況是在HTML表單中。ASP+提供了一套映射傳統的HTML用戶接口小部件(包括列表框,文本框和按鈕)的網絡表單控件和一套附加的網絡控件(如日歷和廣告轉板)。這些控件的一個重要特點是,它們可以被編寫以適應客戶端的能力;同一網頁把大范圍的客戶端平臺和表單因素作為目標。換句話說,網絡表單控件能“嗅”到正在查找表單的客戶,然后返回合適的用戶經驗——可能是適合低級瀏覽器的HTML3.2或是適于IE5.0的動態HTML。
考慮到網絡是一種無狀態的聯接模型,網絡應用程序開發人員所面臨的一個很復雜的問題是,他們要對用戶與基于網絡的接口的交互作用作出反應。網絡利用ASP+的體系架構提供了一套豐富的服務,以幫助開發人員建立交互式網頁。用戶與網頁交互作用的狀態管理的復雜性被ASP+網絡表單和網絡表單控件隱藏起來了。對開發人員來說,提供的豐富數據綁定服務使得顯示通過數據訪問服務得到的數據變得非常容易。
代碼與內容的分離使ASP+網頁能動態地編譯到受控類中,用以提高性能。每個引入的HTTP請求都被傳遞到一個新的網頁實例中,因此開發人員不需要關心代碼中的線程安全性問題。
ASP+網絡服務
ASP+網絡服務體系架構為用ASP+建立網絡服務提供了一個高級可編程模板。雖然建立網絡服務并不需要使用網絡服務平臺,但是它提供許多的優點將簡化應用程序的開發過程,并且它使用的編程模型對用ASP或VB工作的開發人員來說是很熟悉的。使用這個可編程模型,開發人員可以不需要理解HTTP、SOAP或其它任何網絡服務規范。ASP+網絡服務可編程模型如圖3所示。
開發人員用ASP+生成一個擴展名為 .ASMX的文件,并把此文件配制為網絡應用程序的一部分,就建立起了一個網絡服務。ASMX文件包含受控類的引用,或這個類的定義。這個類是由ASP+提供的WebService類所派生的。公有的類方法在標記上WebMethod屬性后,就會成為網絡服務方法,把HTTP請求發送到ASMX文件中的URL后,這些方法就會被調用。你不必手工為你的網絡服務建立一個契約。當被調用者發出請求時,ASP+會檢查類的元數據,從而自動生成SCL文件。
客戶可通過SOAP、HTTP GET和HTTP POST提交請求。對方法和參數進行編碼的約定是:HTTP GET,將被編譯為查詢字符串;HTTP POST,將被編譯為表單數據。HTTP GET和HTTP POST 的機制不如SOAP有力,但是它們使得客戶在訪問網絡服務時不必支持SOAP。
ASP+網絡服務模型假定了一個無狀態服務結構。無狀態結構通常比有狀態結構更具可擴展性。每次收到一個服務請求后,就生成一個新對象,請求被轉化為一個方法調用,當方法調用返回時對象被銷毀。如果這些服務需要跨請求維護狀態,那么它們將使用ASP+狀態管理服務;贏SP+的網絡服務在網絡應用程序模型中運行,因此它們得到了該模型的所有安全、配制和其它優點。
ASP+網絡服務還提供了一個為在SCL文件中描述的網絡服務生成分類的受控代理工具。代理生成器把SCL文件中描述的消息映射成受控類中的方法。代理對應用程序代碼隱藏了所有的網絡和引導設備,因此使用網絡服務看起來就象使用其它受控代碼一樣。代理將優先使用SOAP鏈接網絡服務,但是它同樣支持HTTP GET和HTTP POST機制。
結論
網絡服務為在Internet上綁定應用程序提供了簡單的、靈活的、基于多標準的模型,同時,最大可能地重用現存體系架構和應用程序。網絡應用程序可以很容易地與本地開發的服務或已存在的服務集成在一起,而不用考慮開發平臺、開發語言或使用的對象模型,以用于實現任何組成的服務或應用程序。
Microsft.NET框架為開發人員提供了一個極為方便的開發環境,從而簡化了安全、可靠、可擴展、高可用性的網絡服務的建立、部署和不斷的發展。
文章來源于領測軟件測試網 http://www.kjueaiud.com/