Các dịch vụ Web Gvhd: Nguyễn Tấn Trần Minh Khang
192
Chương 16 Các dịch vụ Web
Hiện nay, vẫn còn một số hạn chế lớn trong các ứng dụng Web. Người dùng bị giới
hạn chỉ thực hiện được những nội dung đã được cấu trúc cho một trang cụ thể và
xem dữ liệu thông qua một số giao diện cụ thể nào đó đã được thiết kế trên máy
chủ. Do đó người dùng muốn lấy được thông tin được linh động và hiệu quả hơn.
Hơn nữa, thay vì ta hiển thị thông tin thông qua trình duyệt Web, ta muốn chạy một
phần mềm trực tiếp trên máy khách mà có thể trao đổi dữ liệu trên máy chủ tuỳ ý.
Công nghệ .NET cho phép xây dụng cách dịch vụ Web ( Web Services ) đáp ứng
được các yêu cầu trên. Ý tưởng chính là : thay vì liệt kê các thông tin theo dạng
HTML, trang tạo sẵn một loạt các lệnh gọi hàm. Các lệnh gọi hàm này có thể trao
đổi thông tin qua lại giữa các hệ cơ sở dữ liệu trên máy chủ. Các hàm này có thể
chấp nhận các tham số và có thể trả về một giá trị tùy ý.
Các dịch vụ Web vẫn dựa trên giao thức HTTP để truyền dữ liệu, đồng thời nó cần
phải sử dụng thêm một loại giao thức để phục vụ cho việc gọi hàm. Hiện nay có hai
giao thức được dùng chủ yếu là : SOAP ( Simple Object Access Protocol ) và SDL
( Service Description Language, đây là giao thức riêng của Microsoft ). Cả hai giao
thức này đều được xây dụng dựa trên XML, mục đích chung của chúng là giúp định
nghĩa các lệnh gọi hàm, tham số và giá trị.
Ngoài ra, Microsoft cũng đưa ra thêm một ý tưởng mới về tập tin Discovery File,
có phần mở rộng là .disco. Tập tin dạng này dùng để cung cấp các thông tin cho các
trình duyệt để các trình duyệt này có thể xác định được các trang trên các máy chủ
mà có chứa các dịch vụ Web.
Sau đây, ta sẽ tìm hiểu một ví dụ nhằm minh họa việc tạo ra một dịch vụ Web, đóng
vai trò là một thư viện chứa một tập các hàm tiện ích. Trang Web của chúng ta sẽ sử
dụng các hàm của dịch vụ này. Dịch vụ Web của chúng sẽ có tên
MathService
, đơn
giản là định nghĩa bốn phương thức cộng, trừ, nhân, chia trên hai số thực bất kỳ.
Mỗi phương thức đều nhận vào hai đối số kiểu số thực và trả về kết quả cũng có
kiểu số thực.
Đầu tiên ta cần tạo một dự án kiểu Web Service bằng cách chọn : New
Project\Visual C# Project\ASP.NET Web Service và đặt tên cho dự án là
MathService và đổi tên dịch vụ thành MathService.asmx. NET có tạo sẵn cho
chúng ta một số tập tin như :
• Service1.asmx : được trình duyệt yêu cầu, tương tự với tập tin .aspx.
• WebService1.cs: trang chứa mã C# quản lý.
• DiscoFile1.disco
: tập tin khám phá.
Các dịch vụ Web Gvhd: Nguyễn Tấn Trần Minh Khang
193
Trong ví dụ này, chúng ta sẽ tạo ra một Web Form mới và thiết giao diện như sau :
Web Form sẽ gọi thực thi các hàm của dịch vụ Web.
Dự án của ta sẽ thừa kế namespace là
System.Web.Services.WebService,
nơi chứa
các thuộc tính và phương thức cần thiết để tạo dịch vụ Web.
public class MathService : System.Web.Services.WebService
Trên mỗi phương thức ta cần khai báo thuộc tính
[WebMethod]
, để chỉ ra đây là
phương thức sẽ được sử dụng cho dịch vụ Web. Mã của tập tin dịch vụ sẽ như sau :
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
namespace MathService
{
public class MathService :System.Web.Services.WebService
{
public MathService()
{
InitializeComponent();
}
#region Component Designer generated code
private IContainer components = null;
private void InitializeComponent()
{
}
protected override void Dispose( bool disposing )
Các dịch vụ Web Gvhd: Nguyễn Tấn Trần Minh Khang
194
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
//4 hàm toán học của dịch vụ Web, trên mỗi phương thức
//ta cần khai báo thuộc tính [WebMethod] để chỉ đây là
//phương thức dành cho dịch vụ Web.
[WebMethod]
public float Add(float a, float b)
{
return a + b;
}
[WebMethod]
public float Subtract(float a, float b)
{
return a - b;
}
[WebMethod]
public float Multiply(float a, float b)
{
return a * b;
}
[WebMethod]
public float Divide(float a, float b)
{
if (b==0) return -1;
return a / b;
}
}
}
Bây giờ chúng ta sẽ viết mã thực thi cho trang Web. Trang Web của chúng ta sẽ gọi
các hàm của dịch vụ tương ứng với các phép cộng, trừ, nhân, chia . Sau đây là mã
của trang Web:
<%@ Import Namespace="MathService" %>
<html>
<script language="C#" runat="server">
float operand1 = 0;
float operand2 = 0;
public void Submit_Click(Object sender, EventArgs E)
{
try
{
operand1 = float.Parse(Operand1.Text);
operand2 = float.Parse(Operand2.Text);
}
catch (Exception) { /* bỏ qua lỗi nếu có */ }
Các dịch vụ Web Gvhd: Nguyễn Tấn Trần Minh Khang
195
//tạo ra một đối tượng dịch vụ MathService để có thể truy cập đến
//các hàm thành viên của chúng.
MathService service = new MathService();
switch (((Control)sender).ID)
{
case "Add" : Result.Text = "<b>Result</b> = " +
service.Add(operand1, operand2).ToString(); break;
case "Subtract" : Result.Text = "<b>Result</b> = " +
service.Subtract(operand1, operand2).ToString(); break;
case "Multiply" : Result.Text = "<b>Result</b> = " +
service.Multiply(operand1, operand2).ToString(); break;
case "Divide" : Result.Text = "<b>Result</b> = " +
service.Divide(operand1, operand2).ToString(); break;
}
}
</script>
<body style="font: 10pt verdana">
<h4>Using a Simple Math Service
</h4>
<form runat="server">
<div style="padding:15,15,15,15;background-
color:beige;width:300;border-color:black;border-
width:1;border-style:solid">
Operand 1:<br>
<asp:TextBox id="Operand1" Text="15" runat="server"
/><br>
Operand 2:<br>
<asp:TextBox id="Operand2" Text="5" runat="server"
/><p>
<input type="submit" id="Add" value="Add"
OnServerClick="Submit_Click" runat="server">
<input type="submit" id="Subtract" value="Subtract"
OnServerClick="Submit_Click" runat="server">
<input type="submit" id="Multiply" value="Multiply"
OnServerClick="Submit_Click" runat="server">
<input type="submit" id="Divide" value="Divide"
OnServerClick="Submit_Click" runat="server">
<p>
<asp:Label id="Result" runat="server" />
</div>
</form>
</body>
</html>