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 ứngdụ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ìmhiể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> . 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. 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"