實現WebService
Visual Basic 6中的COM可以讓我們通過僅僅幾行代碼在一個獨立的文件中(可能是DLL或EXE)運行軟件。后來,我們又有了更多的技術和DCOM,可以使我們在其他的機器上通過僅僅幾行代碼在一個獨立的文件中運行代碼。
在VB.NET中,我們又得到了Web Service,它是DCOM的有效延伸。Web Service允許用戶通過互聯網、內部網,或在同一臺機器上調用方法或函數,并返回相應的結果。在VB.NET中,應用軟件和DCOM之間的聯系再也無須象在VB6中那樣緊密了,我們只需發現Web Service的用處,然后使用它即可,而無需在GUID、類型庫、注冊等方面浪費時間。
在本篇稿子中,我們將首先建立一個Web Service,然后讓應用程序調用它。現在讓我們立即開始吧。
假想
想象一下我們可以通過Web Service做什么。也許可以通過在網站上添加Web Service獲得產品的可用性,這將使開發人員簡單地調用Web Service函數,并在應用中使用返回的結果。
可能你不與產品打交道,而希望獲得包裹跟蹤信息、股票行情、利率、天氣預報、拍賣品資料等,甚至還可以用來獲得訂單。因此,Web Services的用處非常大,也非常容易使用。
由于它如此簡單,下面我們將立即著手建立相應的應用程序:
·在VB.NET中創建一個新的Web Service工程。
![]() 圖:Services Rendered1 |
在經過適當的處理后,屏幕上將顯示Design模式下的Service1.vb。Web Service沒有可視化模式,盡管可 以在其中使用一些控制,強化Design模式界面。
下面我們進入代碼模式:
·雙擊[Design]模式下Service1.vb窗口的任一處,將會轉入核心的代碼窗口。
提示:在處理Service1.vb文件時,在Solution Explorer中也就選定了Service1.asmx文件。該.asmx文件是互聯網服務的真正路徑,.VB文件是它的代碼。
我們會注意到在屏幕上會顯示許多預生成的代碼,其中包括一個HelloWorld樣例函數。我們不運行其中的例子函數,我們將迅速地編寫出自己的代碼。
·在HelloWorld例子下添加下面的代碼:
| Public Function ReverseName(ByVal Name As String) As String ReverseName = StrReverse(Name) End Function |
這一函數與正常的函數的區別是其中的標記,它能夠使VB.NET將這一函數作為Web Service的一部分。
這一函數僅僅實現對Name參數的反轉,沒有其他別的功能。
提示:除了Function后面跟參數這種方式外,還可以使用Function后面不帶參數,Sub后面帶參數或者不帶參數等多種形式來定義函數。
·保存工程。
·選取菜單上的Build項編譯設計的互聯網服務。
·在Solution Explorer中右擊Service1.asmx文件,并選擇View in Browser選項,這將使我們無需妄動瀏覽器,從而省下一些麻煩。
這一網頁就會自動產生,并起著你設計的互聯網服務的用戶界面的作用。普通用戶并非要使用這種方法來訪問數據,但對于 開發人員使用它來驗證信息的有效性時,這就是一個比較好的方法。
![]() 圖:Services Rendered2 |
·閱讀ReverseName函數所提供的信息。
·提供一個Name參數,并點擊Invoke按鈕。
在我的機器上,我在一個新的窗口中得到了如下的返回信息:
由于機器配置和名字的不同,你得到的返回信息可能會與我有所不同。
應該注意的是,在這里返回的是XML。XML是“存儲關系數據”的一種方法,與HTML的書寫方式在結構上很類似。
提示:Web Service是通過SOAP起作用的。SOAP是簡單對象訪問協議的縮寫,是通過HTTP協議進行通訊的一種基于XML的協議。
避開技術細節問題,我們可以發現在XML內部返回的字符串是erooM lraK,正好是Karl Moore字符串的反轉。因此Web Service是有效的,我們已經創建了一個函數并通過Web界面對它進行了訪問,我們也看到了它返回的XML格式的結果。但我們如何在實際生活中使用它呢?
現實生活中的Web Service
盡管我們已經知道了如何創建一個簡單的互聯網服務,并通過Web界面訪問它,但這對我們在現實生活中的幫助并不大,是嗎?
下面,我們來創建一個對我們有較大幫助的應用程序:
·在VB.NET中創建一個新的Windows Application。
![]() 圖:Services Rendered3 |
提示:并非只有Windows Application類的應用程序才能使用Web Service,也可以將這種技術與Web Form結合使用,甚至可以在Web Service中使用Web Service,創建使用了使用Web Services創建的Web Services的Web Services。
·在Form1上添加一個Button。
·將其Text屬性改變為:Get that Groovy Value, Cowboy!。
現在,我們需要為我們設計的Web Service添加一個“引用”。
·依次選擇Project->Add Web Reference。
·在Address文本框處輸入我們的Web Service的地址。
例如,我在Address文本框處輸入了:http://abydos/WebService1/Service1.asmx
這一地址除顯示我們曾看到過的同一個網頁,還將包括一個獨立的使我們能夠瀏覽協議和文檔的面板,這就是發現階段的全部。
·點擊Add Reference按鈕。
現在我們添加一些可以利用添加的Web Service的代碼:
·雙擊Button。
·在其Click事件中添加如下所示的代碼:
| Dim objTest As New abydos.Service1() MessageBox.Show(objTest.ReverseName("Karl Moore")) |
也許在這里你會改變機器的名字,但核心的代碼不會因此而改變。我們在Abydos服務器上創建了Service1的一個新實例,然后運行ReverseName函數,向它傳遞字符串“Karl Moore”(或其他字符串),并在MessageBox中顯示返回結果。
提示:可能會注意到objTest還有許多其他的功能,而不只有我們使用的ReverseName互聯網方法。
·擊F5鍵測試我們的應用程序。
![]() 圖:Services Rendered4 |
注意應用程序是如何運行的,是如何調用Web Service和返回結果的?要做到這一點并不難,XML可以很方便地為我們做到這一點。
盡管在本例中我們使用了本地的Web Service,但我們可以從任何地方返回任何結果,這也正是Web Service的優勢所在。
但是否會出現在VB6的COM和DCOM應用程序中曾經出現過的兼容性等問題呢?在VB.NET中,這些問題都不會出現。無論在現有的方法上添加新的函數還是新的參數,它一點都不會影響我們的應用程序。只有在改變應用程序使用的函數的名字時,才會收到一個出錯信息。當然,如果完全刪除掉Web Service,那將引起嚴重的錯誤。
我們可以進行進一步的實驗,添加正在運行的外部Web Service的引用,例如在http://uddi.microsoft.com/vs.asp上的Web Service,然后創建測試應用程序。
此外,還可以建立更復雜的服務,并讓網絡上的其他機器使用它們,它的簡單性將使你感到吃驚。
結論
Web Service是VB.NET中更靈活的DCOM,它帶來的進步是革命性的。在上面的稿子中,我們創建了簡單的Web Service,然后在應用程序中發現并使用了它。希望讀者能夠充分理解這種技術,建立自己的服務,并明白其工作原理。



