Web Service學習筆記(2)

創建一個簡單的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自動爲我們生成了一些代碼:

/// <summary>
/// Summary description for Service1
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
} 
在Service類中,有一個名爲HelloWorld的模板方法,它將返回一個字符串。這個方法使用WebMethod特性做修飾,表示該方法對Web Service使用程序可用。WebMethod特性會在後面解釋。
 
按F5運行程序,可以看到如圖所示

 

 

 

添加以下方法

[WebMethod]

public double GetPrice(string stockSymbol)
{
for (int i = 0; i < stocks.GetLength(0); i++)
{
if (string.Compare(stockSymbol, stocks[i, 0], true) == 0)
return Convert.ToDouble(stocks[i, 2]);
}
return 0;
}
[WebMethod]
public string GetName(string stockSymbol)
{
for (int i = 0; i < stocks.GetLength(0); i++)
{
if (string.Compare(stockSymbol, stocks[i, 0], true) == 0)
return stocks[i, 1];
}
return "Symbol not found.";
}
重新運行項目,發現多了兩個方法調用的入口。
 
Web Service指令
普通的.aspx文件把Page指令作爲第一行代碼,而Web Service則有一個WebService指令(直接在vs不能看到,可以找到文件Service1.asmx右擊編輯):
<%@ WebService Language="C#" CodeBehind="Service1.asmx.cs" Class="StockWebService.Service1" %>
Language:指定 Web Service中使用的語言,不是必需的
Class:指定Web Service的類名稱,必需的
CodeBehind:如果這個類沒有包含在Web Service文件的代碼中,且類沒有被手工編譯並放在bin子目錄下,WebService指令的CodeBehind屬性則用於指定實現WebService類的源代碼文件的名稱。
Debug:如果設爲true,將以啓用調試的方式編譯Web Service。默認爲false

 

從WebService類繼承

雖然是可選選項,但是它有幾個優點,主要優點是可獲得對ASP.NET幾個常見對象的訪問權:

Application對象和Session對象(狀態管理)、User對象(驗證Web服務器調用者的身份)、Context對象(可以訪問HttpContext類中調用者請求的所有特定HTTP信息)

當然也不可不繼承WebService類,可能是爲了克服來自.NET Framework的限制。

通過HttpContext控制Application狀態

Web Service可通過HttpContext控制Application對象(也可以訪問所有的ASP.NET資源)

例:在Service1.asmx.cs中添加如下方法:

/// <summary>
/// set exchange of stock
/// </summary>
/// <param name="exchange"></param>
[WebMethod]
public void SetStockExchange(string exchange)
{
Application["exchange"] = exchange;
}
[WebMethod]
public string GetStockExchange()
{
return Application["exchange"].ToString();
}

 

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)。

 

作者:Alexis
出處:http://www.cnblogs.com/alexis/