創建一個簡單的Web Service
上一章節中提到Web Service與網頁的相似之處,這裏在總結下:
1。由和通用語言運行時完全實現,包含面向對象架構,所有基類,還有一些特性,如緩存、狀態和數據訪問
2。幾乎一致的文件和代碼結構
3。所有源代碼文件都是普通文本
4。vs完全支持,可以使用vs十分便捷的編輯、調試
5。使用一個基於普通文本的配置文件和vs的網站管理工具做全局或者應用程序級配置。
Web Service沒有界面,它只有方法,有一些事支持從客戶端遠程調用的。Web Service文件的後綴名爲asmx。
在Web Service應用程序第一次運行時,如果Web Service是人工編譯的,並且被放在虛擬跟目錄的bin目錄下,那麼代碼隱藏對於內聯編碼有性能優勢,因爲asmx文件在Web Service運行時都會被編譯成一個類。而ASP.NET 2.0在默認情況下沒有這一優勢,因爲ASP.NET 2.0 把源代碼放在App_Code目錄下,並且在第一個使用時編譯。
下面是一個實例(股票跟蹤,不使用數據庫,只是爲了演示,故使用二維數組)
這個Web Service提供兩個方法:
GetName:參數是一個StcokSymbol對象,返回一個字符串,內容是股票名稱
GetPrice:參數是一個StcokSymbol對象,返回一個數字,表示當前股票的價格
我使用的是vs2010,
首先新建一個項目(WebSite也可以),注意選擇.NET Framework 3.5,默認4是沒有Web Service選項的。選擇ASP.NET Web Service Application,命名爲StockWebService,如圖
我們可以看到,vs自動爲我們生成了一些代碼:
添加以下方法
[WebMethod]
雖然是可選選項,但是它有幾個優點,主要優點是可獲得對ASP.NET幾個常見對象的訪問權:
Application對象和Session對象(狀態管理)、User對象(驗證Web服務器調用者的身份)、Context對象(可以訪問HttpContext類中調用者請求的所有特定HTTP信息)
當然也不可不繼承WebService類,可能是爲了克服來自.NET Framework的限制。
通過HttpContext控制Application狀態
Web Service可通過HttpContext控制Application對象(也可以訪問所有的ASP.NET資源)
例:在Service1.asmx.cs中添加如下方法:
WebServiceBinding特性
Web Service描述語言(WebServices Description Language,WSDL)定義的綁定可作爲.NET類訪問WebService的接口。即綁定會定義一系列操作。一個WebService類有一個默認的綁定,它包含該類的所有Web方法,該類不存在與非默認綁定的關聯。WebServiceBinding特性用於識別非默認綁定。WebService類可以具有多個WebServiceBinding特性,每一個都可以指定不同的綁定。如果Name屬性被忽略,那個這個特性將指定默認綁定。
屬性 | 類型 | 讀 | 寫 | 說明 |
ConformsTo | WsiProfiles | ╳ | ╳ | 綁定需要遵守的WS-1標準 |
EmitConformanceClaims | Boolean | ╳ | ╳ | 如果爲true,當WSDL描述時,綁定會發出遵守的聲明 |
Location | String | ╳ | ╳ | 定義綁定的位置,默認值爲當前Web Service的URL |
Name | String | ╳ | ╳ | 綁定名稱 |
Namespace | String | ╳ | ╳ | 與綁定關聯的命名空間 |
WebMethod特性
Web Service由WebService類定義的,對於WebService類而言,並不需要將所有的方法提供給Web Service使用者。對需要提供的方法,須:
1。聲明爲public
2。在方法聲明之前設置WebMethod特性(即加上[Web Service])
WebMethod包含一些屬性,用於設定web方法的行爲。語法:[WebMethod(PropertyName=value)],以下是一些屬性的說明
BufferResponse:默認情況下,ASP.NET在從服務器端向客戶端發送響應之前,會對整個響應進行緩存。多數情況下,這是最好的做法。但是,如果響應非常長,那麼需將 它設爲false類禁用緩存,如果設爲false,則返回到客戶端的響應時16kb的塊。默認值爲true
CacheDuration:如同網頁,Web Service也能夠把返回到客戶端的結果進行緩存(有點:如果客戶端發出的請求與由另一個客戶端發出的請求完全一致是,那麼服務器就返回緩存中的響應,可以改善性能)。CacheDuration定義第一次請求之後的多少秒內,會在響應中將緩存頁被髮送給隨後的請求。一旦緩存過期,則發送新頁面給請求。默認值爲0,即禁用結果緩存。如果web'方法返回的數據沒有改變(如:從一小時更新一次數據庫中獲取數據的查詢),那麼就可以設置結果緩存爲一個合適的時間,例如1800(30分鐘)。令一方面,如果返回的數據是動態的,那麼需要設置緩存持續時間較短或乾脆禁用。如果Web Service沒有一個相對有限的參數範圍,緩衝也不適合使用。
Description:對web方法的描述,字符串類型
EnableSession:默認爲false。如果設爲true,web方法將啓用會話狀態。如果設爲ture且Web Service繼承自WebService類,那麼會話可以使用WebService.Session。允許會話狀態爲應用程序增加了額外的開銷。
MessageName:在C#類中,方法可以擁有相同的名字(重載),Web Service禁止使用重載。WebMethod特性的MessageName屬性可以消除由多個相同名稱造成的無法識別的問題。它允許對每一個方法的重載使用唯一的別名。當重載方法在SOAP消息中引用時,SOAP消息將使用MessageName而非方法的名稱。
TransactionOption:ASP.NET web方法可以使用事務,但是僅當事件在web方法中初始化時可以使用。TransactionOption屬性用於設置web方法是否啓動一個事務。然而,因爲web方法的事務必須爲根對象,所有隻有兩個不同的行爲,啓用一個新對象(Required、RequiresNew)或者不啓動(Disabled、NotSupported、Supported)。如果在Web Service中啓用事務,需:1。添加System.EnterpriseServices.dll引用 ;2。添加命名空間(using System.EnterpriseServices;);3。向WebMethod特性添加TransactionOption屬性,並設置爲Required(或RequiresNew)。