31 Web 服务

Web 服务是一个基于网络的功能,可被 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 指令如下:

  1. <%@ WebService Language="C#" CodeBehind="~/App_Code/StockService.cs"
  2. Class="StockService" %>

步骤 (5) : 打开 StockService.cs 文件,在该文件里生成的代码是 Hello World 服务的基础代码。默认的 web 服务代码如下:

  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Linq;
  6.  
  7. using System.Web;
  8. using System.Web.Services;
  9. using System.Web.Services.Protocols;
  10.  
  11. using System.Xml.Linq;
  12.  
  13. namespace StockService
  14. {
  15. // <summary>
  16. // Summary description for Service1
  17. // <summary>
  18.  
  19. [WebService(Namespace = "http://tempuri.org/")]
  20. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  21. [ToolboxItem(false)]
  22.  
  23. // To allow this Web Service to be called from script,
  24. // using ASP.NET AJAX, uncomment the following line.
  25. // [System.Web.Script.Services.ScriptService]
  26.  
  27. public class Service1 : System.Web.Services.WebService
  28. {
  29. [WebMethod]
  30.  
  31. public string HelloWorld()
  32. {
  33. return "Hello World";
  34. }
  35. }
  36. }

步骤 (6) : 修改文件内的代码增加一个存储了各股票标签,名称和价格的字符串的二维指针,并编写获取股票信息的两个 web 方法如下;

``` using System; using System.Linq;

  1. using System.Web;
  2. using System.Web.Services;
  3. using System.Web.Services.Protocols;
  4. using System.Xml.Linq;
  5. [WebService(Namespace = "http://tempuri.org/")]
  6. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  7. // To allow this Web Service to be called from script,
  8. // using ASP.NET AJAX, uncomment the following line.
  9. // [System.Web.Script.Services.ScriptService]
  10. public class StockService : System.Web.Services.WebService
  11. {
  12. public StockService () {
  13. //Uncomment the following if using designed components
  14. //InitializeComponent();
  15. }
  16. string[,] stocks =
  17. {
  18. {"RELIND", "Reliance Industries", "1060.15"},
  19. {"ICICI", "ICICI Bank", "911.55"},
  20. {"JSW", "JSW Steel", "1201.25"},
  21. {"WIPRO", "Wipro Limited", "1194.65"},
  22. {"SATYAM", "Satyam Computers", "91.10"}
  23. };
  24. [WebMethod]
  25. public string HelloWorld() {
  26. return "Hello World";
  27. }
  28. [WebMethod]
  29. public double GetPrice(string symbol)
  30. {
  31. //it takes the symbol as parameter and returns price
  32. for (int i = 0; i < stocks.GetLength(0); i++)
  33. {
  34. if (String.Compare(symbol, stocks[i, 0], true) == 0)
  35. return Convert.ToDouble(stocks[i, 2]);
  36. }
  37. return 0;
  38. }
  39. [WebMethod]
  40. public string GetName(string symbol)
  41. {
  42. // It takes the symbol as parameter and
  43. // returns name of the stock
  44. for (int i = 0; i < stocks.GetLength(0); i++)
  45. {
  46. if (String.Compare(symbol, stocks[i, 0], true) == 0)
  47. return stocks[i, 1];
  48. }
  49. return "Stock Not Found";
  50. }
  51. }
  1. **步骤 (7)** : 运行 web 服务应用给出了一个 web 服务测试页面,我们可以在该页面测试服务方法。
  2.  
  3. ![](/projects/asp.net/OEBPS/images/stock_service.jpg)
  4.  
  5. **步骤 (8)** : 点击一个方法名字,确认它是否在正确运行。
  6.  
  7. ![](/projects/asp.net/OEBPS/images/get_name_service.jpg)
  8.  
  9. **步骤 (9)** : 为检测 GetName 方法,提供已经被定义的股票标签中的一个,正确的话会返回相关股票的名称。
  10.  
  11. ![](http://www.tutorialspoint.com/asp.net/images/name_of_stock.jpg)
  12.  
  13. ### 使用 Web 服务
  14.  
  15. 为使用该 web 服务,我们在相同的解决方案(Solution)下创建一个网站,只需在解决方案管理器上右击该解决方案名字即可,web 服务调用的网页应具有一个控制管理以显示返回的结果和两个控制按钮,一个用于返回另一个用于开始调用服务。
  16.  
  17. web 应用的文件内容如下:
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="wsclient._Default" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5. <title>
  6. Untitled Page
  7. </title>
  8. </head>
  9. <body>
  10. <form id="form1" runat="server">
  11. <div>
  12. <h3>Using the Stock Service</h3>
  13. <br /> <br />
  14. <asp:Label ID="lblmessage" runat="server"></asp:Label>
  15. <br /> <br />
  16. <asp:Button ID="btnpostback" runat="server" onclick="Button1_Click" Text="Post Back" style="width:132px" />
  17. <asp:Button ID="btnservice" runat="server" onclick="btnservice_Click" Text="Get Stock" style="width:99px" />
  18. </div>
  19. </form>
  20. </body>
  21. </html>
  1. web 应用的代码如下:
  1. using System;
  2. using System.Collections;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Web;
  7. using System.Web.Security;
  8. using System.Web.UI;
  9. using System.Web.UI.HtmlControls;
  10. using System.Web.UI.WebControls;
  11. using System.Web.UI.WebControls.WebParts;
  12. using System.Xml.Linq;
  13. //this is the proxy
  14. using localhost;
  15. namespace wsclient
  16. {
  17. public partial class _Default : System.Web.UI.Page
  18. {
  19. protected void Page_Load(object sender, EventArgs e)
  20. {
  21. if (!IsPostBack)
  22. {
  23. lblmessage.Text = "First Loading Time: " + DateTime.Now.ToLongTimeString
  24. }
  25. else
  26. {
  27. lblmessage.Text = "PostBack at: " + DateTime.Now.ToLongTimeString();
  28. }
  29. }
  30. protected void btnservice_Click(object sender, EventArgs e)
  31. {
  32. StockService proxy = new StockService();
  33. lblmessage.Text = String.Format("Current SATYAM Price:{0}",
  34. proxy.GetPrice("SATYAM").ToString());
  35. }
  36. }
  37. }
  1. ### 创建代理服务器
  2.  
  3. 代理服务器指的是一个 web 服务代码的代替者。在使用 web 服务之前,我们必须创建一个代理服务器。这个代理服务器是由客户端应用注册的。然后客户端应用实现调用 web 服务使之像在使用一个本地方法一样。
  4.  
  5. 该代理服务器将调用,并用适当的格式将调用像发送 SOAP 请求一样发送到服务器。SOAP 支持简单对象访问协议(Simple Object Access Protocol)。该协议适用于 web 服务数据交换。
  6.  
  7. 当此服务器响应并返回一个 SOAP 包给客户端时,代理服务器将一切呈现给客户端应用程序。
  8.  
  9. 使用 btnservice_click 调用 Web 服务之前,Web 应用应该被添加到应用程序。这将透明地创建一个代理类,可由 btnservice_click 事件使用。
  1. protected void btnservice_Click(object sender, EventArgs e)
  2. {
  3. StockService proxy = new StockService();
  4. lblmessage.Text = String.Format("Current SATYAM Price: {0}",
  5. proxy.GetPrice("SATYAM").ToString());
  6. }
  1. 采取以下步骤创建代理:
  2.  
  3. **步骤 (1)** : 在解决方案管理器(SolutionExplorer)的 web 应用入口处右击选择 Add Web Reference’。
  4.  
  5. ![](/projects/asp.net/OEBPS/images/add_web_reference.jpg)
  6.  
  7. **步骤 (2)** : 选择 Web Services in this solution’,会返回我们编写的股票服务引用。
  8.  
  9. ![](/projects/asp.net/OEBPS/images/select_web_services.jpg)
  10.  
  11. **步骤 (3)** : 点击该服务打开测试页面,创建代理时默认为 localhost’,当然你也可以进行重命名。点击 Add Reference 来实现向客户端应用程序添加一个代理。
  12.  
  13. ![](/projects/asp.net/OEBPS/images/stock_service2.jpg)
  14.  
  15. 在代码中加入以下语句使之包含该代理:

using localhost; ```