Web服務很酷;Web方法也風靡一時。但是它們僅僅是另一個短時間流行的技術,一個無永久價值的事物嗎?如果我們忽視它們足夠久,它們能消失嗎?不,這個技術有持久的生命力,到處都有使用它編寫的東西。它不僅僅是炒作。 Web服務是開發技術的瑞士軍刀上的一個真正有用的刀刃。使用何種方法呢?
利用Web服務,你不需要重新開發不屬於你的程序設計語言的內部功能或者開發工具運行時間庫的功能,然而公共的功能足夠對許多--至少有一些開發者來說是夠用了。 而且,在很多情況下Web服務的返回值是動態的,比如給定郵政編碼地區的天氣情況、當前時間、這個或那個東西的價格、道路狀況等等。在這些情況下,無論如何,你都將訪問一些動態信息源(從因特網上讀取),所以消費一個已經創建來提供你的應用程序需要的信息的Web服務就很少或者沒有性能缺陷了。
在本示例中,我們將創建一個返回任何給定日期是星期幾這樣的Web服務(在.NETspeak中,一個"Web方法")。 我們還將創建一個WinForm客戶端,傳遞所需的年、月和日的值到這個Web方法中。
創建Web Method/Service
啟動C# Builder,選擇File|New | Other | ASP.NET Service Application
改名為"DOW",意思是"Day Of the Week"。
創建兩個文件:WebService1.asmx和WebService1.asmx.cs。選擇File | Save As,並且另存WebService1.asmx為DOW.asmx。這還將改變*.cs文件為DOW.asmx.cs。
如果你此時就想運行這個工程,那麼你將得到錯誤信息"unable to attach to ASP.NET process ( typically aspnet_wp.exe)"。在Project Manager中右擊DOW.asmx,並且選擇"Set as start page"。 現在如果你運行它,你將得到一個IE裡的頁面,如下:
改變你的*.asmx和*.asmx.cs的Web方法(WebService1)的默認名為DOW。 此外,添加下面的屬性(使用你的名稱替換我的)。
public class DOW: System.Web.Services.WebService: [WebService(Namespace="http://www.ClayShannon.com")
刪除DOW.asmx.cs文件中的位置標志符web methods(注釋掉),並且在unit的底部添加下面的方法和屬性:
[WebMethod] public string GetDow(int intYear, int intMonth, int intDay) { DateTime d8 = new DateTime(intYear, intMonth, intDay, new GregorianCalendar()); GregorianCalendar gregCal = new GregorianCalendar(); return gregCal.GetDayOfWeek(d8).ToString(); }
此外,在unit的頂部添加下面的代碼:
Using System.Globalization;
現在,當你運行這個應用程序的時候,你將在你的web浏覽器中看到下面這個屏幕:
單擊ServiceDescription,顯示Web方法後的SOAP XML:
單擊GetDow顯示這個頁面:
C# Builder允許你從Web方法/服務本身測試你的Web方法。 你不必首先創建一個客戶端來測試它,這樣多省時間呀,因為不這樣的話你就要在Web服務工程和客戶端工程之間來回切換。
下面是我輸入一些測試數據並選擇Invoke按鈕後的結果的屏幕截圖:
順便說一下,www.ClayShannon.com是一個虛構的URL(它是一個上面顯示的WebService NameSpace屬性中的位置標志符)。然而幸運的是,C# Builder不計較URL的真偽,它仍然返回正確結果。
Web方法/服務已經成功地創建。DOW.dll已經在C:InetpubwwwrootDOWbin中創建。 現在,讓我們編寫一個簡單的客戶端來調用這個方法。
創建客戶端
選擇File | New C# Application。設計器上將顯示一個WinForm。
選擇Project | Add Web Reference。UDDI浏覽器對話框將顯示:
輸入下面的URL到對話框最上端的URL編輯框:
http://localhost/DOW/DOW.asmx
選擇URL編輯框左方的"Go"(右箭頭)按鈕。進度條和它的附屬標簽在UDDI對話框的左下角,讓你了解它正在打開頁面。 它如何將顯示你以前在你的浏覽器中看到的相同的HTML頁面: