發布Web Service
在IIS中建立虛擬目錄
這個步驟很簡單,建立一個虛擬目錄。設定好以後的屬性頁面是:
圖一
這裡我只設定了兩個屬性,其他保持預設狀態。設名稱為:First_web_service,設本地路徑為DLL所在路徑,這裡是:D:\VFP7_Web_Service。
在Visual FoxPro 裡發布 Web Service
工具-〉嚮導-〉Web Services
圖二
彈出如下介面:
圖三
這裡,COM Server裡,我們選擇剛才編譯的那個DLL。
為了獲得更多資訊,按“Advanced...”按鈕,彈出如下對話方塊:
圖四
這裡 WSDL 檔案是必須設定的,它描述這個Web Service 能夠提供的服務,以及對外的介面。我們讓它存放在虛擬目錄下,檔案名稱是FoxWebService.WSDL。
這裡還有一個有用的選項就是“IntellSense Scripts”,關聯Web Service與Visual FoxPro開發環境之間的關係:將Web Service的介面註冊到IntellSense中,這樣在Visual FoxPro裡調用這個Web Service就會很方便的;當然,這裡也可以不將Web Service 註冊到 IntellSense 中,而在Visual FoxPro 裡註冊,具體方法參見:《Visual FoxPro 7 全新登場--Web Service Client》。
還有一個選項“Automatically generate web service file during project build”,意思是:當重新編譯項目產生COM時,同時建立新的Web Service檔案;這個選項其實是一個Visual FoxPro的Project Hook,同樣可以在Visual FoxPro的開發環境裡設定。
這裡填寫完有關資料之後,按“OK”,回到圖三。按動“Generate” 按鈕,如果註冊成功,將跳出對話方塊:
到這裡,算是到公告成了。
測試Web Service
簡單的測試代碼
怎麼使用一個Web Service,如果你看過《Visual FoxPro 7 全新登場--Web Service Client》一文,應該是沒什麼問題的,這裡只給出代碼:
*請務必保證 C 盤根目錄中不存在FoxWebService.txt檔案,如果有就刪除它(我們的目的是證明Web Service 是“無狀態”的)
LOCAL oweb as VFPWebService_WS
LOCAL loWS
loWS = NEWOBJECT("Wsclient",HOME()+"ffc\_webservices.vcx")
loWS.cWSName = "VFPWebService_WS"
oweb = loWS.SetupClient("http://BOEWORKS/first_web_service/FoxWebService.wsdl", "FoxWebService", "FoxWebServiceSoapPort")
XMLTOCURSOR(oweb.GetInvoice(0),"test")
?oweb.GetSumSales({^1997-01-01},{^1997-3-30})
如果測試成功了,就請查看C 盤根目錄中的 FoxWebService.txt 檔案,我的檔案中的內容是(根據實驗時間,結果會有不同):
開啟時間23:50:47關閉時間23:50:48開啟時間23:50:50關閉時間23:50:50
無狀態的Web Service
這裡我們發現,在這段代碼執行過程中,Web Service 對象建立、毀滅了兩次;而幾乎同樣的代碼,基於COM的應用,對象只建立、摧毀一次。——這就說明了Web Service是“無狀態”的,客戶程式每一次調用,就自動建立,調用完畢就自動摧毀。這裡調用了兩次,分別是調用GetInvoice()方法和GetSumSales()方法。這兩次方法的調用是沒有任何關係的,也就是說,Web Service是不會儲存前一次調用後產生的狀態,供以後調用時使用,這與傳統的COM調用是有很大的區別的。
這裡最有迷惑力的是這一段代碼:
oweb = loWS.SetupClient("http://BOEWORKS/first_web_service/FoxWebService.wsdl", "FoxWebService", "FoxWebServiceSoapPort")
看上去等同於調用COM時使用的CreateObject(),我還沒有仔細查看SOAP的文檔,但我想這段代碼只是請求Web Service的介面,並在客戶機本地初始化一些東西,而對Web Service沒有什麼影響。
無狀態的利弊
無狀態的最大好處就是高效率,Web Service不是為幾個客戶提供服務的,它不可能記憶每一個用戶端的請求狀態,如果那樣做,系統效率將很低很低。但是,如果Web Service不能知道客戶程式的狀態,也不能與客戶程式進行很好的互動,不能很好的互動,就不能做出大的、好的項目。這是俄我想起了ASP,作為Web 應用程式,它也是無狀態的,但為了實現伺服器與客戶機的互動(狀態記憶),就提出了所謂的儲存在用戶端的 cookies 和伺服器端的Session對象……以求效率與功能的平衡。
到底什麼是Web Service的發布
後記
Web Service 是很新、很流行的東西,很欣慰——Visual FoxPro 7 能很好的支援它的開發。雖然我在學習過程中遇到很多磨難,這不能說這種技術有什麼不好,只能認為我的水平太次,真的應該好好學習了……
又是淩晨一點了,我很擔心這篇東西的價值——有多少網友能順利的把實驗做下來,畢竟本文涉及了很多 Visual FoxPro 開發人員不熟悉的東西……