使用SQLXML 3.0把存儲過程暴露為Web服務
2024-09-05 20:55:49
供稿:網友
最新的技術是web服務。現在出現在所有市場中的類似簡單對象訪問協議(soap)、web服務描述語言(wsdl)、通用描述、發現和集成(uddi)等術語的基本元素都是xml和internet。
web服務用于建立松散連接的應用程序并實現互操作性。松散連接的應用程序使你能重新配置、重新部署或重新定位它的實現而不影響相關的應用程序。互操作性涉及到建立能夠在允許web服務的任何平臺上使用的應用程序。通過web服務暴露sql server給予應用程序一個松散的連接接口,使你能夠修改數據庫的結構和位置而不影響應用程序。另外,web服務使sql server能與更多的編程環境和平臺交互操作。
為了達到互操作性,開發者需要在一套開放的工業標準和協議上建立web服務。xml是這些標準中多數的基礎,提供了不依賴平臺的描述和數據表現。建立在xml上的soap提供了基于標準的向應用程序發送數據和從應用程序接收數據的途徑,代表性的是使用http。wsdl描述了位置、方法、參數和web服務使用的數據類型。uddi為注冊web服務或查找需要的其它web服務的目錄提供了一個接口。通過把這些標準技術和t-sql編程組合在一起,你能把sql server存儲過程實現為web服務。
sql server 2000 web release 3(sqlxml 3.0)的焦點是web服務(你能夠通過鏈接http://microsoft.com/sql/default.asp下載sqlxml 3.0)。sqlxml 3.0使你能夠從數據庫中選擇存儲過程并從虛擬目錄中選擇xml模版,把它們暴露為web服務的方法。因為你能夠通過web服務和傳統方法(例如t-sql exec語句、ole db、ado和odbc)調用存儲過程,你可以最大化地重復使用這些組件。簡單地說,sqlxml 3.0使你能把數據庫編程中的專門技術擴展到web服務中而不需要學習新的語言或工具。下面讓我們看看怎樣把存儲過程轉變為web服務。
配置虛擬目錄。把存儲過程暴露為web服務的第一步是從安裝sqlxml 3.0產生的configure iis support(配置iis支持)菜單項中選擇microsoft iis virtual directory manager(微軟iis虛擬目錄管理器)。要建立虛擬目錄,從左邊的樹視圖中選擇web服務器,接著展開該視圖并點擊默認的web站點。右擊右邊面板中的任意區域,選擇context-》new-》virtual directory來顯示一個new virtual directory properties(新虛擬目錄屬性)對話框。在“安全和數據源”頁面上,輸入能夠訪問northwind示例數據庫的sql server登陸許可。注意你在“通用”頁面上選擇的目錄的許可必須給你在“安全和數據源” 頁面上為iis配置的默認用戶授權(請查看iis文檔尋找配置的詳細信息)。為了避免許可的問題,為你的虛擬目錄選擇inetpub/wwwroot的一個子目錄,iis默認用戶自動擁有訪問inetpub/wwwroot下面數據的權限。下一步,在“設置”頁面上,選擇allow post選項,這樣虛擬目錄能夠接受http post請求。點擊“應用”。
配置虛擬名稱。在配置虛擬目錄后,點擊new virtual directory properties(新虛擬目錄屬性)對話框上的“虛擬名稱”頁面。從虛擬名稱列表中選擇新虛擬名稱,為該虛擬名稱選擇一個名字,接著把它的類型設置為soap。列表1顯示了把soap字符串作為虛擬名稱的vbscript代碼。給虛擬名稱輸入一個路徑。該路徑包含了當你把修改保存到根目錄時從iis虛擬目錄管理器中輸出的wsdl文件。我通常選擇('.'),它選擇相同的目錄作為虛擬目錄。你可以接收對話框中剩余字段的默認值。點擊“保存”。當你保存虛擬名稱時,sqlxml 3.0給你指定的虛擬名稱目錄寫入兩個文件,擴展名為.wsdl。其它的文件擴展名為.ssc,包含iis虛擬目錄管理器使用的存儲過程的xml描述。現在你選擇希望暴露作為web服務方法的存儲過程。在本文的例子中,我使用列表2中所示的ordersforcustomer存儲過程。這個存儲過程返回指定客戶id(作為參數傳遞進的)的訂單集合。進行下一步之前,你必須使用查詢分析器(query analyzer)把這個存儲過程安裝在northwind示例數據庫中。
列表1:調用一個存儲過程的vbscript代碼
sub main()
dim xmlhttp
set xmlhttp = createobject("msxml2.xmlhttp.4.0")
dim request
request = "<?xml version='1.0' encoding='utf-8'
standalone='no'?>" & _
"<soap-env:envelope xmlns:
soap-env='http://schemas.xmlsoap.org/soap/envelope/'>" & _
" <soap-env:body>" & _
" <ordersforcustomer xmlns=
'http://localhost/june2002/soap'>" & _
" <cid>bottm</cid>" & _
" </ordersforcustomer>" & _
" </soap-env:body>" & _
"</soap-env:envelope>"
xmlhttp.open "post", "http://localhost/june2002/soap", false
xmlhttp.send (request)
msgbox (xmlhttp.responsexml.xml)
end sub
列表2:建立ordersforcustomer存儲過程的代碼
create procedure ordersforcustomer @cid nvarchar(50)
as
select * from customers, orders
where customers.customerid = @cid
and customers.customerid = orders.customerid
go
建立web服務。在“新虛擬目錄屬性”對話框的“虛擬名稱”頁面上選擇剛剛建立的虛擬名稱,接著點擊“配置”(configure)。這樣就顯示了soap虛擬名稱配置對話框。在這個對話框中,選擇你希望暴露作為web服務方法的存儲過程。為了選擇一個存儲過程,點擊("..."),它建立你配置虛擬目錄訪問的一個數據庫中可用的存儲過程列表。不要選擇包含for xml子句查詢的存儲過程。作為代替,你必須選擇返回標準結果集合的存儲過程。sqlxml 3.0期望存儲過程返回輸出參數或標準結果的結果集。接著該結果在中間層中被建立為xml。選擇返回標準結果集的存儲過程使所有可以用于web服務或傳統編程方法(例如t-sql)的存儲過程的靈活性最大化了。當你在中間層中建立xml查詢結果,要小心避免sqlxml 3.0的限制(你可以查看sqlxml 3.0在線文檔查看這些限制的詳細信息)。你選擇ordersforcustomer存儲過程后,點擊“確定”(ok),接著點擊soap虛擬名稱配置對話框的“保存”(save)按鈕。這樣你就已經建立了第一個web服務了。你可以使用任何文本編輯器檢查為虛擬名稱選擇的目錄中的wsdl。該wsdl文件包含余你選擇的web服務相對應的方法定義。
為了測試新建立的web服務,使用列表1中顯示的vbscript代碼。該代碼建立一個調用該web服務的soap消息,接著使用xmlhttp對象把該soap請求發送給web服務。soap結果顯示在一個消息框中。這個客戶端簡單演示了soap小心在vbscript和sqlxml 3.0之間的交換。但是,它也顯示了現在存儲過程調用可以通過在http上使用soap跨平臺交互操作,它們通過wsdl和scc文件中的描述提供了到存儲過程的松散連接。