Web 服務是一個基於網路的功能,可被web 應用程式透過web 網路協定取得。 web 服務開發主要包含以下三個面向:
建立web 服務
建立代理伺服器
使用web 服務
一個web 服務就是一個web 應用,基本形式為一個類別包含可以被其他應用程式呼叫的多個方法,它也採用隱藏程式碼結構例如ASP.NET 網頁,但它不存在使用者介面。
為了更好地理解這個概念讓我們創建一個提供股票價格資訊的web 服務。該服務的客戶端可以透過股票的標籤查詢相關的名字和價格。為了簡化這個例子,我們設定股票價格為固定值,並保存在一個二維清單中。這個web 服務包含三個方法:
一個預設的HelloWorld 方法
一個GetName 方法
一個GetPrice 方法
採取以下步驟建立該服務:
步驟(1) : 在Visual Studio 中選擇File -> New -> Web Site,然後選擇ASP.NET Web Service。
步驟(2) : 一個名為Service.asmx 的web 服務檔案和它的程式碼被隱藏,Service.cs 會在這個工程的App_Code 路徑下被建立。
步驟(3) : 將檔案名稱修改為StockService.asmx 和StockService.cs。
步驟(4) : .asmx 檔案簡化了一個WebService 指令如下:
<%@ WebService Language="C#" CodeBehind="~/App_Code/StockService.cs" Class="StockService" %>
步驟(5) : 開啟StockService.cs 文件,在該文件裡產生的程式碼是Hello World 服務的基礎程式碼。預設的web 服務代碼如下:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq ; namespace StockService { // <summary> // Summary description for Service1 // <summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [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"; } } } }
步驟(6) : 修改文件內的程式碼增加一個儲存了各股票標籤,名稱和價格的字串的二維指針,並編寫兩個獲取股票資訊的web 方法如下;
using System; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; [WebService(Namespace = "http://tempuri.org/ ")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // 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 StockService : System.Web.Services.WebService { public StockService () { //Uncomment the following if using designed components //InitializeComponent(); } string[,] stocks = { {"RELIND", "Reliance Industries", "1060.15"}, {"ICICI", "ICICI Bank", "911.55"}, {"JSW", "JSW Steel", "1201.25"}, {"WIPRO", "Wipro Limited", "1194.65"}, {"SATYAM", "Satyam Computers", "91.10"} }; [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public double GetPrice(string symbol) { //it takes the symbol as parameter and returns price for (int i = 0 ; i < stocks.GetLength(0); i++) { if (String.Compare(symbol, stocks[i, 0], true) == 0) return Convert.ToDouble(stocks[i, 2]); } return 0; } [WebMethod] public string GetName(string symbol) { // It takes the symbol as parameter and // returns name of the stock for (int i = 0; i < stocks.GetLength(0); i++) { if (String.Compare(symbol, stocks[i, 0], true) == 0) return stocks[i, 1]; } return "Stock Not Found"; } }
步驟(7) : 執行web 服務應用程式給了一個web 服務測試頁面,我們可以在該頁面測試服務方法。
步驟(8) : 點選一個方法名字,確認它是否正確運作。
步驟(9) : 為偵測GetName 方法,提供已經被定義的股票標籤中的一個,正確的話會傳回相關股票的名稱。
為使用該web 服務,我們在相同的解決方案(Solution)下創建一個網站,只需在解決方案管理器上右鍵單擊該解決方案名字即可,web 服務調用的網頁應具有一個控制管理以顯示返回的結果和兩個控制按鈕,一個用於返回另一個用於開始呼叫服務。
web 應用的文件內容如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="wsclient._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat ="server"> <div> <h3>Using the Stock Service</h3> <br /> <br /> <asp:Label ID="lblmessage" runat="server"></asp:Label> <br /> <br /> <asp:Button ID="btnpostback" runat="server" onclick="Button1_Click" Text="Post Back" /> <asp:Button ID="btnservice" runat="server" onclick=" btnservice_Click" Text="Get Stock" /> </div> </form> </body> </html>
web 應用的程式碼如下:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls ; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; //this is the proxy using localhost; namespace wsclient { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPlbostBack) {Isobject. Text = "First Loading Time: " + DateTime.Now.ToLongTimeString } else { lblmessage.Text = "PostBack at: " + DateTime.Now.ToLongTimeString(); } } protected void btnservice_Click(object sender, EventArgs e) { StockService proxy = new StockService(); = String.Format("Current SATYAM Price:{0}", proxy.GetPrice("SATYAM").ToString()); } } }
代理伺服器指的是一個web 服務代碼的代替者。在使用web 服務之前,我們必須建立一個代理伺服器。這個代理伺服器是由客戶端應用程式註冊的。然後客戶端應用實作呼叫web 服務使之像在使用一個本機方法一樣。
該代理伺服器將調用,並以適當的格式將調用像發送SOAP 請求一樣傳送到伺服器。 SOAP 支援簡單物件存取協定(Simple Object Access Protocol)。該協定適用於web 服務資料交換。
當此伺服器回應並傳回一個SOAP 套件給客戶端時,代理伺服器將一切呈現給客戶端應用程式。
使用btnservice_click 在呼叫Web 服務之前,Web 應用程式應該會被加入到應用程式。這將透明地建立一個代理類,可由btnservice_click 事件使用。
protected void btnservice_Click(object sender, EventArgs e) { StockService proxy = new StockService(); lblmessage.Text = String.Format("Current SATYAM Price: {0}", proxy.GetPrice("SATYAM").ToString()) ; }
採取以下步驟建立代理:
步驟(1) : 在解決方案管理員(SolutionExplorer)的web 應用入口處右鍵選擇'Add Web Reference'。
步驟(2) : 選擇'Web Services in this solution',會傳回我們所寫的股票服務參考。
步驟(3) : 點擊該服務開啟測試頁面,建立代理程式時預設為'localhost',當然你也可以進行重新命名。點擊'Add Reference' 來實現向客戶端應用程式新增一個代理程式。
在程式碼中加入以下語句使之包含該代理程式:
using localhost;