發表於Windows & .NET MAGAZINE 國際中文版雜誌 2005 年五月號 作者:葉建廷
引言:
XML 豐富的資料表達方式,儼然成為後 PC 時代最主要的溝通語言,各大 DBMS廠商設計新一代資料庫系統時,無不考慮將對XML 支援程度列為重大的課題。Web Services 則是以 SOAP 協定實現 XML 資訊交換的最佳方式,本文探討主題即是如何以 Web Services實作多層式架構存取 SQL Server的資料。
觀察中大型企業對於Web應用程式設計上,有效率的資源應用及資訊的安全與否是企業非常重視的事情!一般不可能使用單純的 Client -Server架構,如圖 1,兩層式架構 (Two-Tier) 雖然能滿足客戶瀏覽的基本需求,但是卻會面對許多麻煩的問題:
- 執行效率容易遇到瓶頸:Web Server 除了網頁資訊的傳遞,還必須負擔所有的伺服端商業規則的執行,若伺服器的資源耗盡時,擴充性低。
- 程式重複使用性低:若多人一起開發Web應用程式,相同的邏輯的程式因為沒有元件化,無法達到重複使用的益處。
- 資料庫危險性升高: Web Server 直接與資料庫連線,若連線方式撰寫於網頁中,容易導致資料庫的帳號及密碼外洩。就算是使用 windows 帳號的認證的連線方式,風險仍高,因為萬一 Web Server 被入侵了,資料庫相對的也等於承認駭客的連線,也就完全沒有任何的防備了。
圖 1
至於多層式架構 (N-Tier),如圖 2,則能解決以上所面臨到的問題:
- 執行效率可提升:因為將商業邏輯移交由元件伺服器負責,可藉由硬體的擴充,達到效能的提升,甚至是負載平衡。
- 程式重複使用性高:相同的邏輯的程式都已元件化,程式可直接呼叫使用元件,減少程式開發的負擔。
- 資料庫危險性降低:不直接與資料庫相連接,存取資料庫一定要透過元件,以參數傳遞給負責的相關元件處理,而不能以SQL 語法直接要求資料庫動作,減低資料庫控管的風險。
圖 2
多層式架構並不是新的課題,只是多年的工作經驗觀察,會認真思考以 Microsoft DNA 來規劃的人還是不多。可能因為習慣於方便的開發模式及開發時程的要求,導致企業包袱越來越重,變更架構日益困難。另一方面,開發人員會選擇的程式語言肯定是多樣化的,COM技術架構雖好但是在跨平台呼叫元件上卻困難重重。雖有遠端程序呼叫 ( RPC ) 可使用,不過學習門坎較高,加上各語言有不同的元件,彼此互通性低。
直到 Web Services 出現露出曯光,我們可以把 Web Services 想做是 Internet上的元件,符合 W3C 的規範有了統一的遊戲規則,而且各種語言陸續推出呼叫 Web Services 的 API 供程式設計者使用,元件的跨平台互通更加容易了,如圖3。
圖3
建置 SQL Server 2000的 Web Services
要啟用 SQL Server 2000 對 XML 的支援,必須透過 SQLXML 來實現。因Web Services 是使用標準的 Web 通訊協定如 HTTP、XML、UDDI、SOAP 以及 WSDL 來溝通,SQLXML架構圖如下:
圖4
SQLXML 設定IIS虛擬目錄管理後,會自動產生 WSDL描述所提供的服務,Client 端可以根據WSDL 透過 SOAP 協定和 SQLXML 溝通,資料操作的邏輯則可透過位於虛擬目錄中的 XML 範本 ( Template ) 或是 SQL Server 裡的 Store Procedure 存取資料庫。
先來實做上面的架構,利用 SQL Server 2000 中的 Northwind 範例資料庫,新增一個名為 GetCategories 的 store procedure,供 Web 方法來對應,內容如下:
CREATE PROCEDURE GetCategories @CategoryID int AS
SELECT CategoryID, CategoryName, Description
FROM Categories
where CategoryID >= @CategoryID
GO
再來必須先下載 SQLXML,目前的版本是 SQLXML 3.0 Service Pack 3 (SP3),可以先到微軟的下載中心下載安裝程式,將剛才所下載的SQLXML 3.0 SP3 安裝起來,做一些設定的動作。
Step1. 從 SQLXML 3.0 執行『設定IIS 支援』,透過『 IIS 虛擬目錄管理』,新增一個名為 Northwind 的虛擬目錄,並設定好自行定義的網站『本機路徑』,如圖 5。
圖 5
Step2. 設定『安全性』:連線SQL Server 2000 時的認證方式,如圖 6。
圖 6
Step3. 設定『資料來源』:設定要連接的SQL Server 及使用的資料庫,如圖 7。
圖 7
Step4. 進入『設定』頁籤:由於是要是使用在 Web Services 上,為了安全起見,並不希望提供各種 XML 查詢方式,這裡我們只選擇『允許 template 查詢』及『允許 POST』,如圖 8。
圖 8
Step5. 設定『虛擬名稱』:新增一個虛擬名稱,『名稱』輸入 sqlxml,『型別』選擇 soap,『路徑』請自行決定要放置的路徑,例如筆者的路徑為 D:\wwwroot\Northwind。『Web 服務名稱』輸入 sqlAsXml,供程式呼叫之用,『網域名稱』若有請設定,若沒有,也可以根據 ip 來呼叫,將這些設定『儲存』起來,如圖 9。
圖 9
Step6. 『儲存』完畢後,點選『設定』按鈕,就要開始設定 Web 方法,型別的對應方式有兩種,一種是對應到在資料庫中所撰寫的 store procedure,就是這個畫面中的『SP』,另一種是對應到在 Web Services Server 中的 XML Templates,就是所謂的『範本』。這裡選擇『SP』,因為是要對應剛才所寫的store procedure。在『方法名稱』中輸入 GetCategories,『SP/範本』選擇GetCategories,『輸出為』選擇 XML 物件,點選『儲存』,如圖 10。
圖 10
當 SQLXML 設定完成後,可以先用瀏覽器看看是否已產生對應的 Web Services 服務描述語言(WSDL),http://localhost/NorthWind/sqlxml?wsdl,如果有(如圖11 ),表示 SQLXML 已經產生相對應的 Web Services 了。
圖 11
為了體會Web Services 在不同語言使用上的共通性及方便性,本文提供 ASP 及 ASP.NET 兩種程式碼來學習。ASP 如果要支援 Web Services,必須先安裝 SOAP Toolkit,目前的版本是3.0,可以至微軟下載中心下載安裝。
Mr. Zabo 版權所有,歡迎轉載,但請註明出處及連結!