簡介
.NET最強大的一個方面之一就是可以利用它創建Web服務。一個Web服務就是一個網站所提供的供其它網站調用的外部接口。舉個例子來說,某個金融公司可以為與它的貿易伙伴通過Web服務提供詳細的股票報價,這些信息可以是通過Web頁面進行讀取和顯示的,也可以是從客戶的桌面電腦的應用程序里讀取的。
本文就對Web服務的其中兩個方面進行說明:一是如何創建Web服務;二是如何使用Web服務。作為例子,我們以來自ASPFAQs.com(http://www.aspfaqs.com/aspfaqs/)的FAQS(常見問題解答)的Web服務來解釋如何創建一個Web服務。
創建Web服務
在你創建一個Web服務之前,你首先必須問問自己:“我要向我的用戶提供什么服務?”。本文的目標就是創建這樣一個Web服務:讓其它的用戶在他們自己的網站上顯示來自ASPFAQs.com的常見問題解答(FAQS)的列表。比較理想的功能是限制其他的網站只能夠查看FAQS分類和按分類排列的FAQS,如果你想查看一個問題的答案,就讓用戶去訪問提供服務的網站http://www.aspfaqs.com。本文例子的Web服務最終向其他網站提供如下的功能:
創建一個Web服務是很簡單的,首先創建一個.asmx文件(你可以用Visual Studio .NET或你自己喜歡的任何文本編輯器,推薦使用Web Matrix,它有創建Web服務的模板),Web服務作為一個普通的類進行創建,在方法的前面有一個
就ASPFAQS.com的Web服務來說,首先創建三個通過Web服務訪問的方法,GetCategories, GetFAQsInCategory和GetFAQ,分別實現上面提出的任務1,2,3。并創建一個私有方法GetDataSet,按傳遞過來的SQL查詢組裝成一個DataSet。下面就是實現的代碼:
正如前面所說的那樣,三個通過Web服務訪問的方法都有前導符
需要說明的是:你在進行需要參數的Web服務的方法的調用時,不必擔心傳入參數的類型是否正確,Web服務代碼會自動確保傳入參數類型的正確性,在上面的例子中參數類型為整型,如果惡意的用戶企圖向Web服務傳入象0 'malicious SQL statement這樣的參數,就會返回錯誤的信息:annot convert 0 'malicious SQL to System.Int32. Parameter name: type --> Input string was not in a correct format。然而,如果你傳入字符串類型的參數,你應當記住把單個撇號(’)替換成兩個連續的撇號('')。
使用Web服務
上面,我們創建了Web服務,下面就看看別的網站如何使用這個Web服務。為了方便起見,我們把使用Web服務的客戶網站叫做“消費者”,把提供Web服務網站就“生產者”。最本質的東西就是消費者必須知道要調用生產者的什么方法。如果需要參數的話,這些參數必須轉換成XML格式進行傳入,消費者向生產者發送HTTP請求,并指明要調用的方法和參數,參數可以是通過QueryString形式的SOAP請求或者是以POST的請求頭的形式進行傳遞。
生產者收到發送過來的請求后,對輸入參數進行解包,并調用指定類的適當的方法。如果調用完成,就把結果返回,進行打包,然后發送回消費者。消費者收到響應結果,進行解包,就完成了Web服務的調用。
很明顯,其實我們在使用Web服務時一點也不用擔心發送的HTTP信息的語義,為了達到這樣的目的,我們可以使用一個叫做Proxy的類,Proxy的作用是充當消費者應用程序或Web頁面和生產者實際Web服務之間的中間過程。對生產者Web服務的每一個方法來說,同時也在Proxy類里有一個相同的方法,Proxy的職責就是處理所有傳送的復雜消息,這種復雜性在Proxy類里被隱藏起來的,我們只需要簡單地調用該類的方法即可,不必關心語義的事情。
此時你也許很迷惑,但這種迷惑也是可以理解的,這本身就是一個很令人迷惑的話題。要理解的最基本的事情就是:當調用Web服務時消費者和生產者之間的HTTP通信可能是復雜的,而且可能會需要編寫不少的代碼。我們更愿意看到的是,使用Web服務的頁面調用Web服務時就象使用一個本地的組件一樣方便,為了實現這一目標,我們使用Proxy類,它的公用接口與Web服務的方法相對應。如果你此時還感到迷惑的話,請看看這個演示文檔http://aspnet.4guysfromrolla.com/code/ConsumeWS.ppt,它將向你解釋如何使用Web服務。
利用Visual Studio .NET創建Proxy類
在Visual Studio .NET里創建Web服務使用的Proxy類是件輕而易舉的事情,在ASP.NET Web項目里,在“引用”上單擊右鍵,選擇“添加Web引用”,這時會彈出一個對話框,要你輸入一個URL地址,請輸入http://aspnet.4guysfromrolla.com/ws/ASPFAQs.asmx,然后你就會看到這個Web服務的描述(就象你在Web瀏覽器里直接看到的那樣),最后單擊“添加引用”按鈕,Visual Studio .NET會自動為你創建一個Proxy類,并且進行編譯。當你把它添加進你的工程里時,Proxy類的名稱空間可能就是你的網站地址,比如:com.4guysfromrolla.aspnet,當然你還可以任意改成其他的任何名字。從你的Web頁面里通過Proxy類調用Web服務就象你使用本地組件進行調用一樣方便。假設你想顯示ASP.NET類別(category ID為22)FAQS的列表,我們可以通過調用Web服務的GetFAQsInCategory方法,在參數里傳入22,并把返回的DataSet綁定到一個DataGrid,代碼可能象如下的寫法那樣:
檢查一下上面的代碼,你可能不明白對com._4guysfromrolla.aspnet.ASPFAQs Proxy類的調用實際上就是遠程Web服務的調用,當調用Proxy類的GetFAQsInCategory方法時,會進行復雜的數據通訊(HTTP的請求/響應)。
結論
在本文里,我們講述了如何創建Web服務,并如何在ASP.NET頁面里使用它。微軟公司實際上在.NET里已經簡化了創建和使用Web服務的過程。創建一個Web服務簡單到只需創建.asmx文件,然后為Web服務的方法寫一點代碼,并添加