ASP.NET Web Services


Web服務是一種基於Web的功能,可以使用Web應用程式使用的Web協定進行存取。Web服務開發有三個方面:

  • 建立Web服務
  • 建立一個代理
  • 使用Web服務

建立一個Web服務

Web服務是一個Web應用程式,它基本上是由其他應用程式可以使用的方法組成的類。它也遵循一個程式碼隱藏的體系結構,如ASP.NET網頁,儘管它沒有使用者介面。

為了理解這個概念,建立一個Web服務來提供股票價格資訊。客戶可以根據股票程式碼查詢股票的名稱和價格。 為了保持這個例子簡單,股票的資訊被寫死在一個二維陣列中。 這個Web服務有三種方法:

  • 預設的HelloWorld方法
  • GetName方法用於獲取股票的名稱
  • GetPrice方法用於獲取股票的價格

按照以下步驟建立Web服務:

第1步: 在Visual Studio中選擇選單:檔案 -> 新建 -> 網站,然後選擇ASP.NET空網站,輸入專案名稱為:WebServices

第2步: 在專案上右擊選擇「新增新建專案」 ->Web -> Web服務。在專案的App_Code目錄中建立名為Service.asmx的Web服務檔案及其程式碼,檔案Service.cs

第3步: 將上面兩個檔案的名稱更改為StockService.asmxStockService.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步: 更改檔案後面的程式碼,為股票程式碼,名稱和價格新增字串的二維陣列,獲取股票資訊。

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步: 點選方法名稱,檢查是否正常執行。例如,點選:GetName 方法 -

第9步: 要測試GetName方法,提供一個股票程式碼(這裡輸入:JSW並點選呼叫),它是寫死的,它返回股票的名稱 -

使用Web服務

要使用Web服務,請在同一解決方案下建立一個Web站點,名稱為:WebServiceCall 。 這可以通過右鍵單擊解決方案資源管理器中的解決方案名稱來完成。 呼叫Web服務的網頁應該有一個標籤控制元件來顯示返回的結果和一個用於呼叫服務的按鈕。

Web應用程式(Default.aspx)的內容檔案如下所示:


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>WebServices呼叫範例</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>

            <h3>使用股票Web服務的範例</h3>

            <br /> <br />

            <asp:Label ID="lblmessage" runat="server"></asp:Label>

            <br /> <br />
            <asp:Button ID="btnservice" runat="server" onclick="btnservice_Click"  Text="獲得股票資訊" style="width:99px" />

         </div>
    </form>
</body>
</html>

Web應用程式的檔案(Default.aspx.cs)的後端程式碼如下所示:

using System;
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;


public partial class _Default : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            lblmessage.Text = "第一次載入時間: " + DateTime.Now.ToLongTimeString();
         }
        else
        {
            lblmessage.Text = "回傳時間: " + DateTime.Now.ToLongTimeString();
        }
    }

    protected void btnservice_Click(object sender, EventArgs e)
    {
        StockService proxy = new StockService();
        lblmessage.Text = String.Format("當前SATYAM股票的價格:{0}",
        proxy.GetPrice("SATYAM").ToString());
    }
}

建立代理

代理是Web服務程式碼的替代品。在使用Web服務之前,必須建立代理。 代理向用戶端應用程式註冊。然後,用戶端應用程式使用本地方法呼叫Web服務。

代理接受呼叫,以適當的格式包裝它,並將其作為SOAP請求傳送到伺服器。SOAP代表簡單物件存取協定。該協定用於交換Web服務資料。

當伺服器將SOAP包返回給用戶端時,代理解碼所有內容並將其呈現給用戶端應用程式。

在使用btnservice_Click呼叫Web服務之前,應該將Web參照新增到應用程式中。 這會透明地建立一個代理類,由btnservice_Click事件使用。

按照以下步驟建立代理:

第1步: 右鍵單擊解決方案資源管理器中的Web應用程式條目,然後單擊新增服務參照,然後選擇高階

第2步: 選擇「此解決方案中的Web服務」。它返回StockService 參照。

第3步: 點選服務開啟測試網頁。 預設情況下,建立的代理名稱為localhost,也可以重新命名它。點選「新增參照」將代理新增到用戶端應用程式。

在程式碼後面的程式碼中加入代理,方法是:

using localhost;

執行WebServiceCall 專案,得到以下結果 -

點選獲取股票價格 按鈕,得到以下結果 -