天天看點

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,如圖

<a href="http://blog.51cto.com/attachment/201105/173639217.jpg" target="_blank"></a>

我們可以看到,vs自動為我們生成了一些代碼:

/// &lt;summary&gt; 

/// Summary description for Service1  

/// &lt;/summary&gt; 

[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運作程式,可以看到如圖所示

<a href="http://blog.51cto.com/attachment/201105/173736603.jpg" target="_blank"></a>

添加以下方法

public double GetPrice(string stockSymbol)  

for (int i = 0; i &lt; stocks.GetLength(0); i++)  

if (string.Compare(stockSymbol, stocks[i, 0], true) == 0)  

return Convert.ToDouble(stocks[i, 2]);  

return 0;  

public string GetName(string stockSymbol)  

return stocks[i, 1];  

return "Symbol not found.";  

重新運作項目,發現多了兩個方法調用的入口。

Web Service指令

普通的.aspx檔案把Page指令作為第一行代碼,而Web Service則有一個WebService指令(直接在vs不能看到,可以找到檔案Service1.asmx右擊編輯):

&lt;%@ WebService Language="C#" CodeBehind="Service1.asmx.cs" Class="StockWebService.Service1" %&gt;

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中添加如下方法:

/// set exchange of stock  

/// &lt;param name="exchange"&gt;&lt;/param&gt; 

public void SetStockExchange(string exchange)  

Application["exchange"] = exchange;  

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

綁定名稱

Namespace

與綁定關聯的命名空間

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)

    本文轉自xshf12345 51CTO部落格,原文連結:http://blog.51cto.com/alexis/573720,如需轉載請自行聯系原作者

上一篇: 刷build小結