• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

TÌM HIỂU VỀ WEBSERVICE & SỬ DỤNG TRONG C#

Các bài viết hướng dẫn về Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
deptraithongminh
Thành viên tích cực
Thành viên tích cực
Bài viết: 143
Ngày tham gia: T.Ba 02/07/2013 4:58 pm
Đến từ: TPHCM
Has thanked: 17 time
Been thanked: 1 time

TÌM HIỂU VỀ WEBSERVICE & SỬ DỤNG TRONG C#

Gửi bàigửi bởi deptraithongminh » CN 29/05/2016 4:57 pm

Hi các bạn, lâu chưa vào 4rum. Hôm nay, sau 1 thời gian nghiên cứu, mình sẽ hướng dẫn các bạn sử dụng Web Service trong Windows với ngôn ngữ là C#

PHẦN 1: TÌM HIỂU SƠ VỀ WEB SERVICE
* Web Service là những thành phần ứng dụng dùng để chuyển đổi một ứng dụng thông thường sang một ứng dụng web. Đồng thời nó cũng xuất bản các chức năng của mình để mọi người dùng internet trên thế giới đều có thể sử dụng thông qua nền tảng web. Web Serviece truyền thông bằng cách sử dụng các giao thức mở, tài nguyên phần mềm có thể xác định bằng địa chỉ URL, thực hiện các chức năng và đưa ra các thông tin người dùng yêu cầu, các ứng dụng độ lập và tự mô tả chính nó. Nó bao gồm các modun độc lập cho hoạt động của khác hàng và doanh nghiệp và bản thân nó được thực thi trên server. Nền tảng cơ bản của WS là XML + HTTP. Bất cứ một ứng dụng nào cũng đều có thể có một thành phần WS. WS có thể được tạo ra bằng bất kỳ một ngôn ngữ lập trình nào.

* Đặc điểm:
- Cho phép client và server tương tác ngay cả trong môi trường khác nhau. (Ví dụ server chạy linux, client chạy windows).
- Phần lớn được xây dựng dựa trên mã nguồn mở và phát triển các chuẩn đã được công nhận. (Ví dụ XML).
- Nó có thể triển khai bởi 1 phần mềm ứng dụng phía server (Ví dụ : PHP, Oracle Application server, Microsoft .NET)

Mặc dù có nhiều ưu điểm : Có nhiều mô-đun và có thể công bố lên internet, khả năng hoạt động rộng lớn với phần mềm khác nhau chạy nền tảng khác nhau, sử dụng các giao thức chuẩn mở, nâng cao khả năng tái sử dụng, cho phép các tiền trình / chức năng nghiệp vụ đóng gói trong giao diện dịch vụ web, dễ dàng cho việc phát triển các ứng dụng phân tán. Nhưng những thiệt hại lớn sẽ xảy ra vào khoảng thời gian chết của dịch vụ web, có quá nhiều chuẩn cho dịch vụ web khiến người dùng khó nắm bắt, phải quan tâm nhiều hơn tới vấn đề an toàn và bảo mật.

(tham khảo từ Web Services Tutorial - W3Schools và các đồ án nghiên cứu về web service)

VD rõ nhất về tính tiện dụng của Web Service: bạn cần máy tính thực hiện công việc A -> bạn sẽ viết code cho công việc A cho máy tính; nhưng bên cạnh đó bạn cũng muốn phát triển chương trình cho smartphone thực hiện công việc A -> lại phải viết code xử lí A cho phone, khá mất công. => như vậy có thể làm theo hướng: viết 1 hàm xử lí công việc A, đưa lên Web Service (tức là lên mạng); khi cần chỉ cần cho tương tác đến cái hàm kia, rất tiện (chỉ mỗi tội phải có kết nối net, mà cái này thì giờ chắc 24/24 luôn rồi :) :) :) )

PHẦN 2: CÁCH THỰC HIỆN ĐỂ CÓ THỂ TƯƠNG TÁC VỚI CSDL QUA MẠNG INTERNET TRÊN WP8/u]
Gồm 3 bước:
+[u]1: Tạo CSDL SQL Server (yêu cầu: từ SQL Server 2008 R2 trở lên):
chắc bước này ai cũng biết nên khỏi nói

+2: Tạo WebService để tương tác với CSDL: ở đây mình dùng đề tài quản lý kho hàng
– Mình 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:
Hình ảnh
– 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:
Hình ảnh
– Sau khi bấm OK, ta có giao diện như dưới đây:
Hình ảnh
– Bây giờ ta tiến hành viết .net webservice để tương tác tới CSDL đã tạo như sau (mình muốn dùng LinQ để viết code cho lẹ và giúp các bạn dễ hiểu hơn, các bạn hoàn toàn có thể viết các hàm như Procedure trong SQL, khi kết nối đến project WebService nó sẽ tự chuyển thành code C#):
Từ menu View/ chọn Server Explorer để mở cửa sổ kết nối CSDL như bến dưới đây:
Hình ảnh
– Trong màn hình Server Explorer/ ta bấm chọn biểu tượng kết nối mà mình tô vòng tròn màu đỏ.
– Màn hình kết nối được hiển thị ra như dưới đây:
Hình ảnh
– 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:
Hình ảnh
5) Bấm OK để chấp nhận Kết nối. Kết quả như sau:
Hình ảnh
– 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:
Hình ảnh
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:
Hình ảnh
– Sau khi bấm nút Add, ta được thông tin như hình dưới:
Hình ảnh
– Mình đá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:
Hình ảnh
Ở 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: Catalog và Product). 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:
Hình ảnh
– Ở 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:
Hình ảnh
– 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:

Mã: Chọn hết

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):
Hình ảnh
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:
Hình ảnh
Hình ảnh
Hình ảnh
Mục đích của chúng ta là kết nối từ WP 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 mình muốn hướng dẫn các bạn đưa nó lên Internet (trang Somee.com) để demo thực tế, tại vì thực tế là nó nằm trên internet. WP chỉ là client.

PHẦN 3: TẠO WEB SERVER VÀ TƯƠNG TÁC TỪ CLIENT
1: Tạo Web Server với somee.com
– Bước 1: Vào https://somee.com
– Bước 2: Chọn Free .Net hosting như hình dưới đây:
Hình ảnh
Bấm chọn Learn More để qua bước 3.
- Bước 3: Chọn Order để mua gói miễn phí này:
Hình ảnh
Bước 4: Nhập các thông số cần thiết để tạo tạo tài khoản:
Hình ảnh
Bấm Register new user and continue để đăng ký và tiếp tục với màn hình checkout.
Hình ảnh
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:
Hình ảnh
Màn hình thông báo thành công hiển thị ra dưới đây:
Hình ảnh
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:
Hình ảnh
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 .
Hình ảnh
Sau khi nhập đầy đủ thông tin, bấm chọn “Create empty database”. Nếu tạo thành công thì ta có màn hình như dưới đây:
Hình ảnh
Bạn để ý dòng mình tô xanh , đó 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 somee.com, 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:
Hình ảnh
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:
Hình ảnh
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:
Hình ảnh
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:
Hình ảnh
Để 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:
Hình ảnh
– 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:
Hình ảnh
– Sau đó tiến hành zip như sau:
Hình ảnh
– Ở 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:
1- Chọn File Manager/ cửa sổ hiển thị lên chọn nút Upload như hình bên dưới:
Hình ảnh
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:
Hình ảnh
– Sau khi bấm Upload and unzip archives thì ta có kết quả như sau:
Hình ảnh
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: "http://<tên subdomain>/<tên webservice>.asmx"
Hình ảnh
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.

PHẦN 4: TƯƠNG TÁC TỪ C# (desktop)
Từ WebProject ở trên, bạn tạo thêm 1 Windows Form Project để lấy dữ liệu từ Service đó như sau:
Hình ảnh
– Khi bấm Nút “Get List Catalog”: Chương trình sẽ triệu gọi web service (hàm getListCatalog) lưu trên http://testdrthanh.somee.com/mywebservice.asmx và hiển thị vào ListBox (listbox_cate)
– Khi chọn Catalog bất kỳ trong listbox_cate thì sẽ hiển thị danh sách sản phẩm thuộc danh mục đang chọn vào listbox_product.
– Khi bấm nút “Delete Selected Product”: Sẽ xóa Product đang chọn trong listbox_product.
Sau đây là cách lấy dữ liệu từ webservice ở trên:
1- Bấm chuột phải vào Project/ chọn Add Service Reference:
Hình ảnh
2- Màn hình chọn WebService hiển thị ra như bên dưới đây:
Hình ảnh
3- Bấm chọn nút “Advanced“:
Hình ảnh
4- Ở màn hình trên ta chọn “Add Web Reference…“:
Hình ảnh
Mục số 1: Ta copy dán đường dẫn webservice vào
Mục số 2 đặt tên cho Web Reference rồi nhấn nút “Add Reference“.
Sau khi bạn nhấn nút “Add Reference” thì Project sẽ được thay đổi như sau:
Hình ảnh
File app.config tự động xuất hiện và bên trong nó có thông tin sau:
Hình ảnh
– Bây giờ ta tiến hành Coding cho các control trên giao diện như sau:

Mã: Chọn hết

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace TestWebService
{
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }
 bool isFinish = false;
 com.somee.testdrthanh.mywebservice test = new com.somee.testdrthanh.mywebservice();
 //Nút hiển thị danh sách Catalog
 private void button1_Click(object sender, EventArgs e)
 {
 isFinish = false;
 
 List<com.somee.testdrthanh.Catalog> listCate = test.getListCatalog().ToList();
 listbox_cate.DataSource = listCate;
 listbox_cate.DisplayMember="CateName";
 listbox_cate.ValueMember="CateId";
 isFinish = true;
 }
 //xử lý hiển thị danh sách sản phẩm theo danh mục
 private void listbox_cate_SelectedIndexChanged(object sender, EventArgs e)
 {
 if (!isFinish) return;
 if (listbox_cate.SelectedItem != null)
 {
 com.somee.testdrthanh.Catalog cate = listbox_cate.SelectedItem as com.somee.testdrthanh.Catalog;
 List<com.somee.testdrthanh.Product> listProduct = test.getListProductByCatalogId(cate.CateId).ToList();
 listbox_product.DataSource = listProduct;
 listbox_product.DisplayMember = "ProductName";
 listbox_product.ValueMember = "ProductId";
 }
 }
 //xử lý nút xóa Product
 private void button2_Click(object sender, EventArgs e)
 {
 if (listbox_product.SelectedItem == null)
 return;
 DialogResult ret = MessageBox.Show("Muốn xóa Product này hả?", "Xác nhận xóa", MessageBoxButtons.YesNo);
 if (ret == DialogResult.Yes)
 {
 com.somee.testdrthanh.Product p = listbox_product.SelectedItem as com.somee.testdrthanh.Product;
 bool isDelete= test.deleteProduct(p.ProductId);
 if (isDelete)
 {
 com.somee.testdrthanh.Catalog cate = listbox_cate.SelectedItem as com.somee.testdrthanh.Catalog;
 List<com.somee.testdrthanh.Product> listProduct = test.getListProductByCatalogId(cate.CateId).ToList();
 listbox_product.DataSource = listProduct;
 listbox_product.DisplayMember = "ProductName";
 listbox_product.ValueMember = "ProductId";
 }
 else
 {
 MessageBox.Show("Không xóa được");
 }
 }
 }
 }
}

Khi thực thi thì ta có kết quả như sau:
Hình ảnh

Mình đã 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, cách tương tác với Webservice...
Chúc các bạn thành công !!! ;) ;) ;)



Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách