Bài 44: Cách tạo Webservice

Tui rất lấy làm xin lỗi vì đã để một thời gian dài mới quay lại hướng dẫn bài tập 43, vì lý do phải bận viết giáo trình một số môn học.

Để làm được “bài 43 – quản lý đăng ký học phần bằng sms cho các trường đại học”, Tui sẽ cung cấp từng kỹ năng độc lập sau đó quay lại bài 43 các bạn có thể tự làm được một cách dễ dàng.

Trong bài tập 44 này Các bạn sẽ được học:

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:

0h41_10h41_2– 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:

0h41_3

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:

0h41_4

– 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:

0h41_5

– Sau khi bấm OK, ta có giao diện như dưới đây:

0h41_6

– 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:

0h41_7

– 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:

0h41_8

– 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:

0h41_9

5) Bấm OK để chấp nhận Kết nối.

Kết quả như sau:

0h41_10

– 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:

0h41_11

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:

0h41_13

– Sau khi bấm nút Add, ta được thông tin như hình dưới:

0h41_14

– 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:

0h41_15

Ở 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 Product). Thông qua các lớp này chúng ta có thể tương tác được với CSDL. Các bạn cần học thêm phần LINQ to SQL ở mục LinQ trong menu lập trình tiên tiến: http://duythanhcse.wordpress.com/lttt/ Tui không có thời gian để nói thêm phần này.

– 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:

0h41_12

– Ở 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:

0h41_16

– 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:

[code language=”csharp”]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

///
/// Summary description for mywebservice
///

[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 getListCatalog()
{
List 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 getListProduct()
{
List 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 getListProductByCatalogId(string id)
{
List 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;
}
}

[/code]

– 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):

0h41_17

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:

0h41_18

0h41_19– 0h41_20

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:

0h41_21

Bấm chọn Learn More để qua bước 3.

Bước 3: Chọn Order để mua gói miễn phí này:

0h41_22

Bước 4: Nhập các thông số cần thiết để tạo tạo tài khoản:

0h41_23– Bấm Register new user and continue để đăng ký và tiếp tục với màn hình checkout.

0h41_24

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:

0h41_25Màn hình thông báo thành công hiển thị ra dưới đây:

0h41_26– 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:

0h41_27

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 .

0h41_28

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:

0h41_29

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:

0h41_30

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:

0h41_31

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:

0h41_32Ta 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:

0h41_33Để 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:

0h41_34

– 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:

0h41_36

– Sau đó tiến hành zip như sau:

0h41_37

– Ở 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:

0h41_38

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:

0h41_39

– Sau khi bấm Upload and unzip archives thì ta có kết quả như sau:

0h41_40– 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://testdrthanh.somee.com/mywebservice.asmx :

0h41_41

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

Chúc các bạn thành công.

54 thoughts on “Bài 44: Cách tạo Webservice”

  1. Thưa thầy khi nào thầy mới dạy tiếp bài tiếp theo ạ (cách dùng Android kết hợp với KSOAP API để lấy dữ liệu từ webservice này.)

  2. Thưa thầy cho em hỏi phần thầy set null, em vẫn chưa hiểu rõ tại sao phải cần làm như vậy. Em có đọc qua một số tài liệu web service với linq khác nhưng không tìm được phần giống như vậy, nên cũng không tìm được giải thích cặn kẽ…

  3. public List getListCatalog()
    {
    List listCate = db.Catalogs.ToList();
    foreach (Catalog c in listCate)
    c.Products.Clear();
    return listCate;
    }
    thầy cho em hỏi nếu bảng Catalog độc lập không liên quan tới Products. thì trong vòng foreach viết cái ji ạ

  4. thầy ơi, với java viết web service thì mình sẽ đưa lên thế nào ạ, thầy có thể viết 1 bài sử dụng java để tạo web service soap và đưa lên giống như c# này được không thầy. Hiện em đã viết được web service bởi java với axis2 nhưng em chưa biết đưa server để có thể truy xuất từ trang web hay ứng dụng của mình về thầy ạ.
    Em cảm ơn thầy. 😀

  5. Thưa thầy em đã up lên và vào http://www.teswebservice.somee.com/mywebservice.asmx
    thì bị lỗi
    Server Error in ‘/’ Application.

    The resource cannot be found.

    Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.

    Requested URL: /mywebservice.asmx

  6. Em muốn hỏi là nếu trong CSDL mà mình tạo có 1 cột để lưu trữ ảnh ví dụ định dạng image chẳng hạn. Thì làm các phương thức set hoặc get ,getlist ảnh trong myservice sẽ làm như thế nào. Em cảm ơn

  7. thầy ơi cho em hỏi chút là webservice có áp dụng với SQLite k ạ, nếu được thầy chỉ em một chút cách get, set data được k thầy. Em cảm ơn

  8. Thầy ơi!Mỗi lần mình muốn thêm một phương thức vào web thì lại phải làm lại từ đầu ak?.có cách nào nhanh hơn không a?

  9. đỉnh quá thầy ơi, em yêu thầy.
    đây thực sự là một bài em kiếm bấy lâu nay, cực đơn giản, chi tiết, dễ hiểu, ko thừa cũng ko thiếu. tuyệt vời.
    chúc thầy mạnh khỏe.

  10. Thầy ơi cho em hỏi.Em làm theo hướng dẫn của thầy đến đoạn Đưa file Backup lên Server somee nhưng nó toàn báo lỗi “The file you selected is not a MS SQL database backup file!” là sao hả thầy?Em tạo file backup đúng như hướng dẫn của thầy không sai tí nào,em cảm ơn thầy!

  11. Thầy ơi sao cái bước cuối cùng webservice của e đã đc up lên somee.com rồi nhưng click vào từng method nó lại ko xử lí gì cả mà feedback lại là ” The test form is only available for requests from the local machine”.
    Link webservice của em: http://hoangbc.somee.com/WebService.asmx
    Mong thầy feedback sớm.

  12. List listCate = db.Catalogs.ToList();
    foreach (Catalog c in listCate)
    c.Products.Clear();
    Và:
    List listPro = db.Products.ToList();
    foreach (Product p in listPro)
    p.Catalog = null;
    return listPro;

    Có ai hiểu, ý nghĩa 2 vòng lặp foreach để làm gì không?

  13. Em chào thầy ạ! Bài viết rất hay ạ! Thầy cho em hỏi làm làm sao để down một file (ví dụ: a.mp3) từ trên webservices về được ạ! Cái phương thức đó như thế nào ạ!

  14. sau khi em đưa lên thì bị lỗi “HTTP Error 503. The service is unavailable.” ạ. mọi người có ai gỡ lỗi giúp em được không ạ? em cám ơn

      1. dạ em đưa lên lại vài lần thì được rồi ạ. Thầy cho em hỏi thêm là nếu em muốn phân quyền cho database trên host (như phân quyền trong sql server management studio thì phải làm sao ạ?

  15. Bài viết rất củ thể, nhưng trên visual studio 2013 thì em viết các phương thức xóa thì dòng lệnh [Tên bảng] a = get[Tên bảng](giá trị truyền vào method); bị lỗi thầy

      1. em cảm ơn thầy, em hiểu cách làm rồi ạ. thầy giảng dễ hiểu, nhưng câu nào thầy kêu tự làm em đều làm được hết.

Leave a Reply