Cách tạo Webservice

ngày 31-03-2016

Trong bài hướng dẫn này, các bạn sẽ được học cách tạo Web Service:
 
1) Cách tạo 1 CSDL trong SQL Server
 
2) Cách viết .net Webservice để tương tác với CSDL
 
3) Cách thức đưa CSDL và .net webservice lên somee.com
 
——————————————————————–
 
1) Cách tạo 1 CSDL trong SQL Server:
 
– CSDL trong bài tập này sẽ được sử dụng trong hàng loạt các bài tiếp theo
 
– Tui muốn tạo 1 CSDL tên là dbProductManager với cấu trúc như dưới đây:
 

 

– Hiển nhiên các bạn phải tự tạo được CSDL như trên.
 
– Bạn có thể dùng bất kỳ Version SQL Server nào cũng được (2005, 2008, 2012…)
 
– Tui chụp hình cấu trúc cây DB và version mà Tui Demo cho bài tập này như sau:
 
 
 
2) Cách viết .net Webservice để tương tác với CSDL
 
– Tui sử dụng Visual Studio 2010 để tạo Webservice, bạn có thể dùng 2012, 2013 cũng được không sao.
 
– Từ menu File/ chọn New/ chọn Website (hoặc nhấn tổ hợp phím Shift +ATL+ N) để tạo một website trong visual studio:
 
 
– Màn hình chọn Project xuất hiện: Ta chọn Empty Website như hình dưới đây rồi nhấn nút OK:
 
 
– Sau khi bấm OK, ta có giao diện như dưới đây:
 
 
– Bây giờ ta tiến hành viết .net webservice để tương tác tới CSDL tạo ở mục số 1 như sau:
 
– Tui muốn dùng LinQ to SQL để viết code cho lẹ và giúp các bạn dễ hiểu hơn, ta làm như sau:
 
Từ menu View/ chọn Server Explorer để mở cửa sổ kết nối CSDL như bến dưới đây:
 
 
– Trong màn hình Server Explorer/ ta bấm chọn biểu tượng kết nối mà Tui tô vòng tròn màu đỏ.
 
– Màn hình kết nối được hiển thị ra như dưới đây:
 
 
– Tui đánh theo thứ tự từ 1->5:
 
1) Server name: Nhập tên Server của máy bạn vào đây, trên kia thì máy của tui tên là drthanh.
 
2) Chọn kiểu Authentication, bạn chọn loại nào cũng được, trên kia tui chọn Windows Authentication.
 
3) Chọn CSDL, dĩ nhiên ta phải chọn đúng CSDL dbproductmanager.
 
4) Test connection để kiểm tra xem có kết nối thành công hay không, khi bạn test mà nó ra cửa sổ sau là OK:
 
 
5) Bấm OK để chấp nhận Kết nối.
 
Kết quả như sau:
 
 
– Bây giờ ta tiến hành dùng LinQ to SQL để tương tác tới CSDL này như sau:
 
Bấm chuột phải vào Project website tạo ở bước trên/ chọn Add New Item:
 
 
Trong màn hình New Item ta chọn LINQ to SQL Classes như hình dưới đây, đặt tên ProductManager.dbml rồi nhấn nút Add:
 
 
– Sau khi bấm nút Add, ta được thông tin như hình dưới:
 
 
– Tui đánh dấu hình trên thành 4 vùng : 1,2,3,4.
 
Vùng 1: là vùng CSDL
 
Vùng 2: Là vùng ta kéo thả CSDL vào
 
Vùng 3: là vùng ta kéo thả các Store Procedure vào
 
Vùng 4: Vùng cấu trúc tập tin, lớp mà ta lập trình.
 
– Bây giờ ta tiến hành kéo thả CSDL vào vùng số 1 như sau:
 
+ Đè phím Ctrl + click chuột vào 2 bảng Catalog và Product rồi kéo vào vùng số 2, ta được giao diện:
 
 
Ở bước trên, hệ thống đã tự phát sinh các lớp, hàm (CRUD) cho phép chúng ta tương tác tới CSDL một cách dễ dàng. Ở đây nó tự động sinh ra lớp ProductManagerDataContext và các lớp tương ứng với mỗi bảng (tức là có 2 lớp tự động được phát sinh: CatalogProduct). Thông qua các lớp này chúng ta có thể tương tác được với CSDL. 
 
– Tiếp tục tạo Webservice để cung cấp các hàm lấy dữ liệu, ta cũng bấm chuột phải vào Project/ chọn Add new Item để hiển thị màn hình dưới đây:
 
 
– Ở màn hình trên ta chọn Web Service, đặt tên cho nó (mywebservice) rồi nhấn nút Add.
 
– Khi nhấn nút Add, mặc định ta có thông tin của web service như sau:
 
 
– Ta tiến hành thêm một số hàm để sử dụng cho bài tập này như sau:
 
1- Hàm đếm xem có bao nhiêu danh mục trong bảng catalog
 
2- Hàm trả về danh sách Catalog
 
3- Hàm trả về thông tin của 1 Catalog theo Id
 
4- Hàm trả về danh sách Product
 
5- Hàm trả về danh sách Product theo Catalog Id
 
6- Hàm trả về thông tin của một Product theo Id
 
7- Hàm xóa Catalog theo ID
 
8- Hàm xóa Product theo ID.
 
9- Xuất tổng tiền của các mặt hàng
 
Ta lần lượt viết các hàm này như sau:
 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Services;

 

/// <summary>

/// Summary description for mywebservice

/// </summary>

[WebService(Namespace = "http://tranduythanh.com/")]

[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 mywebservice : System.Web.Services.WebService {

 

ProductManagerDataContext db = null;

 public mywebservice () {

 

//Uncomment the following line if using designed components

//InitializeComponent();

 db = new ProductManagerDataContext();

 }

 

[WebMethod]

 public string HelloWorld() {

 return "Hello World";

 }

 //Hàm đếm xem có bao nhiêu danh mục trong bảng catalog

 [WebMethod]

 public int CountCatalog()

 {

 return db.Catalogs.Count();

 }

 //2- Hàm trả về danh sách Catalog

 [WebMethod]

 public List<Catalog> getListCatalog()

 {

 List<Catalog> listCate = db.Catalogs.ToList();

 foreach (Catalog c in listCate)

 c.Products.Clear();

 return listCate;

 }

 //3- Hàm trả về thông tin của 1 Catalog theo Id

 [WebMethod]

 public Catalog getCatalog(string id)

 {

 Catalog c=db.Catalogs.FirstOrDefault(x => x.CateId == id);

 c.Products.Clear();

 return c;

 }

 //4- Hàm trả về danh sách Product

 [WebMethod]

 public List<Product> getListProduct()

 {

 List<Product> listPro = db.Products.ToList();

 foreach (Product p in listPro)

 p.Catalog = null;

 return listPro;

 }

 //5- Hàm trả về danh sách Product theo Catalog Id

 [WebMethod]

 public List<Product> getListProductByCatalogId(string id)

 {

 List<Product> listPro=db.Products.Where(x => x.CateId == id).ToList();

 foreach(Product p in listPro)

 p.Catalog=null;

 return listPro;

 }

 //6- Hàm trả về thông tin của một Product theo Id

 [WebMethod]

 public Product getProduct(string id)

 {

 Product p = db.Products.FirstOrDefault(x => x.ProductId == id);

 p.Catalog = null;

 return p;

 }

 //7- Hàm xóa Catalog theo ID

 [WebMethod]

 public bool deleteCatalog(string id)

 {

 try

 {

 Catalog cate = getCatalog(id);

 db.Catalogs.DeleteOnSubmit(cate);

 db.SubmitChanges();

 }

 catch (Exception ex)

 {

 return false;

 }

 return true;

 }

 //8- Hàm xóa Product theo ID.

 [WebMethod]

 public bool deleteProduct(string id)

 {

 try

 {

 Product p = getProduct(id);

 db.Products.DeleteOnSubmit(p);

 db.SubmitChanges();

 }

 catch (Exception ex)

 {

 return false;

 }

 return true;

 }

 //9- Xuất tổng tiền của các mặt hàng

 [WebMethod]

 public double getToTalMoney()

 {

 return db.Products.Sum(x => x.TotalMoney).Value;

 }

}

 
– Bạn chú ý đoạn code ở trên tui gán =null nhiều chỗ lý do để xử lý việc Loop trong thao tác Webservice, nếu có sự loop (hay đệ quy) thì nó không chấp nhận. Nếu viết bằng Winform hay Webform bình thường thì không sao.
 
– Ta tiến hành kiểm tra webservice trên máy cục bộ như sau (nhấn F5 để chạy):
 
 
Bạn thấy đấy, các hàm được hiển thị ra ở đây. Để test thì bạn chỉ cần bấm vào hàm rồi chọn Invoke là OK. Tui ví dụ chọn hàm CountCatalog và getListCatalog, getListProductByCatalogId:
 
 
 
 
Mục đích của chúng ta là kết nối từ Android tới Webservice này để tương tác. Bạn có thể cấu hình IIS để chạy trên máy cục bộ, nhưng ở đây TUI muốn hướng dẫn các bạn đưa nó lên Internet (trang Somee) để demo thực tế, tại vì thực tế là nó nằm trên internet. Android chỉ là Client.
 
3) Cách thức đưa CSDL và .net webservice lên somee.com
 
Bước 1: Vào https://somee.com
 
Bước 2: Chọn Free .Net hosting như hình dưới đây:
 
 
Bấm chọn Learn More để qua bước 3.
 
Bước 3: Chọn Order để mua gói miễn phí này:
 
 
Bước 4: Nhập các thông số cần thiết để tạo tạo tài khoản:
 
 
– Bấm Register new user and continue để đăng ký và tiếp tục với màn hình checkout.
 
 
Bước 5: – Chọn các thông số rồi bấm Continue, màn hình Create Website sẽ hiển thị ra như bến dưới, ta nhập các thông tin rồi bấm:
 
 
Màn hình thông báo thành công hiển thị ra dưới đây:
 
 
– Tiếp theo ta tạo CSDL cho trang testdrthanh.somee.com
 
– Bấm chọn mục Databases ở bên tay trái trên màn hình ở trên:
 
 
Màn hình trên nó nút “Create” mà Tui khoanh màu đỏ, ta bấm vào nó. Màn hình tạo CSDL hiển thị ra, ở đây ta nên đặt cùng tên với CSDL mà ta tạo ở máy Client để dễ dàng Backup, Restore .
 
 
Sau khi nhập đầy đủ thông tin, bấm chọn “Create empty database”.
 
sau khi tạo thành công thì ta có màn hình như dưới đây:
 
 
Bạn để ý dòng Tui tô xanh lè, đó chính là chuỗi kết nối tới CSDL, bạn có thể copy paste chuỗi này dán vào chuỗi kết nối ở máy Local của bạn thì khi chạy website nó sẽ kết nối tới CSDL ở trên trang somee này.
 
workstation id=dbproductmanager.mssql.somee.com;packet size=4096;user id=drthanh_SQLLogin_1;pwd=7szjt75abq;data source=dbproductmanager.mssql.somee.com;persist security info=False;initial catalog=dbproductmanager
 
testdrthanh.somee.com chính là sub domain mà nó cung cấp cho mình, dựa vào đây để ta lấy thông tin.
 
– Bây giờ ta tiến hành đưa dữ liệu từ máy Local lên Trang somee, làm như sau:
 
1- Backup lại CSDL tại máy Local của bạn:
 
Bấm chuột phải vào CSDL/ chọn Tasks/ Chọn Backup:
 
 
Màn hình chọn Backup hiển thị ra như dưới đây, ta tiến hành nhập thông số rồi bấm OK:
 
 
Giờ bạn kiểm tra ổ đĩa D:/ xem có tập tin này hay chưa, nếu có tức là đã backup thành công.
 
2- Đưa file Backup này lên Server somee:
 
 
Ta chọn Restore database, rồi chọn “Choose File“, chọn đúng tập tin vừa backup ở trên rồi bấm “Upload the file and restore it“.
 
Chờ báo thành công là OK:
 
 
Để test coi nó có chạy được hay không thì ta chọn mục “New SQL Query” ở màn hình trên, nó sẽ hiển thị ra cửa sổ cho phép ta nhập câu SQL:
 
 
– Như hình trên thì đã thành công.
 
3- Tiếp tục ta đưa Webservice lên somee để Test như sau:
 
– Dùng Win Zip  của hệ điều hành Windows, nén lại source code và đẩy lên server. Dĩ nhiên ta cần sửa chuỗi kết nối lại. Như mục trên Tui đã nói là copy paste chuỗi kết nối :
 
workstation id=dbproductmanager.mssql.somee.com;packet size=4096;user id=drthanh_SQLLogin_1;pwd=7szjt75abq;data source=dbproductmanager.mssql.somee.com;persist security info=False;initial catalog=dbproductmanager
 
Thay thế cho chuỗi có sẵn ở máy Local như sau (dĩ nhiên khi bạn tạo thì chuỗi nó phải khác và bạn phải lấy theo chuỗi của bạn):
 
Trong Project Web Service, mở tập tin Web.config và thay thế bằng chuỗi trên:
 
 
– Sau đó tiến hành zip như sau:
 
 
– Ở hình trên là ta Ctrl+ A để chọn toàn bộ tập tin và thư mục/sau đó ta bấm chuột phải vào 1 tập tin bất kỳ trong thư mục chứa source code/ chọn Send to / chọn Compressed… như hình bên trên, nó phát sinh ra một file zip chứa toàn bộ source code trong này (ta chọn tập tin nào để bấm chuột phải cũng được).
 
– Sau khi có file zip, ta quay lại màn hình somee server để đưa source code lên như sau:
 
Chọn File Manager/ cửa sổ hiển thị lên chọn nút Upload như hình bên dưới:
 
 
Sau khi chọn nút Upload thì nó xuất hiện cho chúng ta nút Choose File để đưa file từ client lên Server/ ta chọn đúng file zip lúc này rồi bấm Upload and Unzip archives:
 
 
– Sau khi bấm Upload and unzip archives thì ta có kết quả như sau:
 
 
– Bạn thấy đấy, toàn bộ source code đã được đưa lên server.
 
– Bây giờ ta tiến hành kiểm tra Webservice có chạy hay không như sau:
 
 
 
Như vậy là đã thành công, bạn có thể tiến hành kiểm tra từng Service trong này.
 
Bài tập này Tui đã hướng dẫn chi tiết cách tạo Webservice, cách tạo CSDL, cách đưa dữ liệu lên Server somee, cách sử dụng LinQtoSQL…
 
Bạn cần thực hành nhiều lần và cố gắng hiểu nó.
 
Trong bài tập kế tiếp Tui sẽ hướng dẫn các bạn cách dùng Android kết hợp với KSOAP API để lấy dữ liệu từ webservice này.
 
Bài tập này rất quan trọng, nó rất hữu ích cho các bạn đặc biệt là khi triển khai dự án thực.
 
Các bạn có thể tải source code và CSDL ở đây, nhớ đổi lại chuỗi kết nối khi thử trên máy tính cá nhân của bạn: http://www.mediafire.com/download/xsuou1aakukrlep/Hoc_Webservice.rar
 
Nguồn: Thầy Trần Duy Thanh - Giảng viên tại Trung Tâm Tin Học ĐH Khoa Học Tự Nhiên
 
Tìm hiểu về khóa học Xây dựng và triển khai Web Service cho ứng dụng di động tại đây.