Asp.net 简明教程

ASP.NET - Web Services

Web 服务是基于 Web 的功能,它使用 Web 协议以供 Web 应用程序使用。开发 Web 服务有三个方面:

  1. Creating the web service

  2. Creating a proxy

  3. Consuming the web service

Creating a Web Service

Web 服务是一项 Web 应用程序,它基本上是一个类,该类由可供其他应用程序使用的方法组成。它还遵循代码分离架构,例如 ASP.NET 网页,尽管它没有用户界面。

为了理解此概念,让我们创建一个 Web 服务以提供股票价格信息。客户端可以根据股票代码查询股票的名称和价格。为了使此示例更简单,我们将值硬编码到二维数组中。此 Web 服务有三种方法:

  1. A default HelloWorld method

  2. A GetName Method

  3. A GetPrice Method

执行以下步骤以创建 Web 服务:

Step (1) : 在 Visual Studio 中选择 File → New → Web Site,然后选择 ASP.NET Web Service。

Step (2) : 在该项目的 App_Code 目录中创建名为 Service.asmx 的 Web 服务文件及其背后的代码文件 Service.cs。

Step (3) : 将文件名称更改为 StockService.asmx 和 StockService.cs。

Step (4) : .asmx 文件中仅有一个 WebService 指令:

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

Step (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";
      }
   }
}

Step (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";
   }
}

Step (7) : 运行 Web 服务应用程序会提供一个 Web 服务测试页,允许测试服务方法。

stock service

Step (8) : 单击方法名称,并检查它是否正常运行。

get name service

Step (9) : 为了测试 GetName 方法,提供一个硬编码的股票代码,它会返回股票名称

name of stock

Consuming the Web Service

要使用 Web 服务,请在同一解决方案下创建一个 Web 站点。这可以通过在 Solution Explorer 中右键单击 Solution 名称来完成。调用 Web 服务的 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" style="width:132px" />

            <asp:Button ID="btnservice" runat="server" onclick="btnservice_Click"  Text="Get Stock" style="width:99px" />

         </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 (!IsPostBack)
         {
            lblmessage.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();
         lblmessage.Text = String.Format("Current SATYAM Price:{0}",
         proxy.GetPrice("SATYAM").ToString());
      }
   }
}

Creating the Proxy

代理是 Web 服务代码的替身。在使用 Web 服务之前,必须创建一个代理。该代理会注册到客户端应用程序中。然后,客户端应用程序会进行对 Web 服务的调用,就像在使用本地方法一样。

代理接收调用,将其包装成适当的格式,作为 SOAP 请求发送给服务器。SOAP 代表简单对象访问协议。该协议用于交换 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());
}

执行以下步骤来创建代理:

Step (1) : 在 Solution Explorer 中右键单击 Web 应用程序项,然后单击“Add Web Reference”。

add web reference

Step (2) : 选择“Web Services in this solution”。它会返回 StockService 引用。

select web services

Step (3) : 单击该服务会打开测试 Web 页。默认情况下,创建的代理名为“localhost”,您可以重命名它。单击“Add Reference”以将该代理添加到客户端应用程序。

stock service2

在代码文件中通过添加以下内容,以包含代理:

 using localhost;