Cách tạo asp.net web api service dùng cho mobile app

Cách tạo asp.net web api service dùng cho mobile app
4.1 (82.86%) 7 vote[s]

Mở đầu

Trong các bài viết trước các bạn đã biết cách tạo và sử dụng wcf rest service trên ứng dụng mobile, cụ thể là ứng dụng windows phone 8.1. Nếu bạn chưa xem thì có thể xem tại đây:

WCF REST Service là một công nghệ tương đối hiện đại nhưng nó vẫn chưa phải là công nghệ RESTfull đầy đủ vì chỉ hỗ trợ GET/POST. Trong bài viết này chúng ta sẽ cùng đi tìm hiểu công nghệ mới nhất của Microsoft hiện nay trợ giúp việc xây dựng các service dành cho các ứng dụng mobile, đó chính là asp.net web api.

ASP.NET Web API là gì?

Nói một cách đơn giản, Web API là API trên nền web (http) và ASP.NET Web API chính là framework giúp chúng ta tạo ra các api này. Web API là các service được xây dựng dựa trên http sử dụng mô hình lập trình convention như ASP.NET MVC. Các Web api service có ưu điểm là sử dụng được ở hầu hết các client từ desktop app, web app (browser) cho đến mobile app. Ưu điểm của web api so với WCF REST Service đó là:

  • Cấu hình hết sức đơn giản so với WCF
  • Performance cao
  • Hỗ trợ RESTful đầy đủ
  • Hỗ trợ đầy đủ các thành phần MVC như: routing, controller, action result, filter, model binder, IoC container, dependency injection, unit test
  • Open Source

Chi tiết sự khác nhau giữa các công nghệ xây dựng service trên Microsoft.NET Framework các bạn có thể xem chi tiết qua bài viết:

Chúng ta đã hiểu qua về ASP.NET Web API, bây giờ chúng ta sẽ cùng bắt tay vào tạo thử các Web API này.

Tạo asp.net web api service

Để tạo asp.net web api service rất đơn giản, hãy cùng làm qua 3 bước dưới đây (Chúng ta sẽ sử dụng lại source code trong bài Cách tạo WCF Service trả về JSON dùng cho Mobile App)

  1. Trong Visual Studio 2013 ta tạo thêm một project ASP.NET Web Application và chọn template Web API như hình dướiTạo project ASP.NETTạo project Web API
  2. Bước tiếp theo chúng ta sẽ tạo Data Model sử dụng Entity Framework để web api service có thể tương tác CRUD (Create, Read, Update, Delete) dữ liệu được.
    Bài này mặc định là bạn đã có SQL Server và database Northwind. Nếu bạn chưa có vui lòng download và cài đặt theo link bên dưới đây:

    Trong project Tungnt.net.WebAPIDemo, right-click vào Models và chọn thêm New Item. Tìm từ khóa Model và chọn ADO.NET Entity Data Model đặt tên NorthwindDataModel như hình dưới:
    Add ADO.NET EDM

    Trong wizard chọn EF Designer from database. Click Next button sau đó chọn New Connection, điền địa chỉ SQL Server trên máy của bạn (ở đây trên máy tôi là .\SQL2008R2) rồi chọn database Northwind. Click OK rồi Next
    Entity Framework

    Entity Framework Connection

    Bước tiếp theo chúng ta chọn bảng Customers để làm việc và click Finish.

    Entity Framework Choose Table

  3. Đến đây chúng ta đã chuẩn bị xong phần Model giờ là lúc tạo ra các Web API.
    Entity Framework Data ModelRight click vào thư mục Controllers và chọn thêm controller. Ở bước này bạn có thể chọn Web API 2 Controller Empty để tự viết các phương thức từ đầu hoặc bạn cũng có thể chọn Web API 2 Controller with read/write actions khi đó Visual Studio sẽ hỗ trợ sinh ra các phương thức ví dụ để bạn có thể biết cách viết các service này. Ở đây tôi chọn Web API 2 Controller with actions, using Entity Framework vì tôi muốn Visual Studio sinh sẵn các code cho tôi theo Model luôn như hình sau:
    Add Web API ControllerTại cửa sổ Add Controller chọn Model class chính là Customer vừa tạo ở bước trên và click Add ta sẽ thấy Visual Studio sinh ra các phương thức Get/Post/Put/Delete với tất cả các code xử lý dùng LINQ theo đúng Model Customer đã chọn
    Add Web API ControllerWeb API Generate Code
    Vậy là công việc tạo các Web API đã hoàn tất chúng ta có thể sử dụng chúng ngay theo đúng template được comment trên đầu mỗi phương thức. Tùy theo nhu cầu bạn có thể viết thêm các phương thức khác trong Web Api controller này hoặc tạo ra các Web API Controller khác để sử dụng theo cách tương tự.

Kiểm tra asp.net web api service

Ở phần trên chúng ta đã biết cách tạo ra các Web API service bây giờ chúng ta có thể kiểm tra các web api service này có chạy hay không ngay trên browser.

  • Build lại project (Ctrl+Shift+B)
  • Set project thành Startup project sau đó Ctrl+F5 để chạy chúng ta sẽ thấy default của ứng dụng có 1 link API, đây chính là trang Help Page liệt kê tất cả các Web API có trong ứng dụng.
    Web API Home Page
  • Ngoài 2 API default là Account, Values giờ đây chúng ta có thêm API về Customer như hình dưới.
    Web API Help Page
    Chi tiết của một API rất đầy đủ, rõ ràng về các thông tin Request (URI, Body parameters) cũng như Response (JSON/XML)
    Web API Help Page
  • Trên browser chúng ta chỉ có thể kiểm tra nhanh được các service dạng Get nên ta sẽ kiểm tra service GetCustomers bằng cách sử dụng url thêm api/Customers như sau
    Web API Browser Test
    Dữ liệu trả về mặc định là dạng xml và chúng ta có thể tạm kết luận web api service chạy tốt. Trong các bài blog tiếp sau tôi sẽ hướng dẫn các bạn cách sử dụng FiddlerRESTClient để có thể kiểm tra được các service POST, PUT, DELETE ở bài viết này chúng ta tạm thời chỉ có thể kiểm tra được service GET.Bạn có thể tham khảo bài viết mới về cách test service dùng Fiddler tại đây:  https://tungnt.net/su-dung-fiddler-test-web-service/

Cấu hình Web API Service chỉ trả về JSON

Qua hai phần trên chúng ta đã biết cách tạo ra và kiểm tra các Web API Service nhưng chúng ta cũng thấy Web API Service trả về cả dạng XML và JSON. Vậy câu hỏi đặt ra là có cách nào để chỉ trả về dạng JSON không?

Câu trả lời rất đơn giản vì Web API đã hỗ trợ sẵn chúng ta chỉ cần config mà thôi. Mở file WebApiConfig.cs trong thư mục App_Start và thêm dòng sau vào trong phương thức Register và thử kiểm tra lại api GetCustomers trên browser ta sẽ thấy service giờ chỉ trả về JSON

Web API Browser Test JSON

Ngoài ra nếu bạn muốn cấu trúc property của object JSON trả về đúng quy cách CamelCase tức là tên property dạng viết thường chữ cái đầu thì có thể thêm config sau vào Register

Web API Browser Test Camel Case JSON

Kết luận

Trong bài viết này tôi đã hướng dẫn các bạn cách thức tạo ra các Web API Service để có thể sử dụng trên các ứng dụng web (qua JavaScript) hoặc ứng dụng mobile như iOS, Android, Windows Phone… Web API là công nghệ mới nhất của Microsoft trong việc xây dựng các service, việc tạo các service cũng đơn giản hơn rất nhiều vì không còn phải cấu hình phức tạp như WCF. Hơn thế nữa Web API là một công nghệ RESTfull nó hỗ trợ tất cả các phương thức: GET/POST/PUT/DELETE dữ liệu nên nếu bạn muốn xây dựng các service cho riêng mình thì ngoài WCF REST Service giờ đây bạn có sự lựa chọn tốt hơn nữa đó chính là Web API.

Trong các bài viết sau chúng ta sẽ cùng tìm hiểu các cách thức xây dựng service khác trên công nghệ .NET cũng như cách kiểm tra các service này bằng các tool như Fiddler, RESTClient trước khi bắt tay xây dựng các ứng dụng client như desktop, mobile.

Hy vọng bài viết này sẽ giúp ích cho các bạn trong quá trình xây dựng các ứng dụng của riêng mình. Nếu bạn có bất kì câu hỏi hay kinh nghiệm nào hãy chia sẻ bằng comment bên dưới bài viết và đừng quên chia sẻ cho bạn bè nếu thấy hữu ích.

Happy coding. Stay tuned.

P/s: Source code example các bạn có thể download tại đây: WebAPIDemo

Comments

    • tungnt185tungnt185 says

      Rất vui khi nó hữu ích với em. Share cho bạn bè để ủng hộ blog nhé. Thanks em.

    • tungnt185tungnt185 says

      Rất vui khi bài viết có ích với bạn . Đăng ký nhận thông báo bài viết mới để ủng hộ blog của mình nhé. Cảm ơn bạn :)

      • Điệp Viên IT says

        Anh ơi hay quá, rất dễ hiểu nữa. e muốn xem thêm mấy phần tiếp theo thì thế nào ạ?

        • tungnt185 says

          Thanks em. Cảm ơn em đã thấy bài viết có ích với mình.
          Em vui lòng subsribe blog của anh hoặc like page để nhận được thông báo khi có bài viết mới nhé :)

  1. VanDung says

    chỗ add 1 bảng customer vào đó nếu cần nhiều bảng thì thế nào vậy bác

    • tungnt185tungnt185 says

      Nếu nhiều bảng thì ở bước tích chọn nhiều bảng để Visual Studio sinh ra nhiều Model tương ứng thôi.

        • tungnt185tungnt185 says

          Có mà em, chính là phần em tạo Controller và Visual Studio đã sinh ra cho em hết các code xử lý kết nối và thao tác với database rồi. Em chỉ việc sử dụng thôi.

  2. DucNam says

    anhcho e hỏi vẫn đề này chút ak. trong app của e cần có avatar do người dùng up lên, vậy mình cần làm như thế nào để tối ưu hơn ak, up lên host của mình, host khác (flickr) rồi lấy link về. Và cách up như thế nào là tốt nhất
    anh chỉ e cách làm được không ak? ( đang cần gấp cho project)
    cảm ơn anh

    • tungnt185tungnt185 says

      Hi Nam,

      Để upload ảnh lên qua service thì có 2 cách:
      – 1 là upload ảnh như là 1 string base64. Em chỉ cần có một property dạng này ở object phía server và gửi nhận qua property này. Cách này dễ làm hơn nhưng performance kém hơn vì mất một số dung lượng để encode thành dạng base64.
      – Cách thứ 2 là post ảnh lên sử dụng stream. Cách này khó làm hơn nhưng performance tốt hơn.

      Vậy em có thể tuỳ theo nhu cầu thực tế để lựa chọn cách làm cho mình.

  3. ngothuy says

    Anh cho em hỏi em add bảng như cách trên của anh.
    -Em có hai bảng thì bảng thứ nhất em dùng khóa chính thì sử dụng được phương thức GetAll(). vậy có bắt buộc ở các bảng đều phải có khóa chính không ạ?
    -khi em post dữ liệu lên bảng có khóa chính thì nó xác định qua khóa chính và tự động sắp sếp theo thứ tự ABC. nhưng h em muốn post lên thì dữ liệu sẽ lên đầu bảng luôn có được không ạ ?

    • tungnt185tungnt185 says

      Hi em,

      2 vấn đề này hoàn toàn khác nhau. Cái mà em thắc mắc nó thuộc về nguyên tắc thiết kế database: Bảng nào cũng phải có khoá chính, khi thêm vào thì khoá chính sẽ tự tăng hoặc sử dụng kiểu GUID còn khi lấy dữ liệu ra thì sắp xếp kiểu gì cũng đc em ạ.

      • ngothuy says

        vậy em muốn bài nào post sau thì dc lên đầu bảng và lấy ra cũng theo thứ tự đấy thi em pải làm thế nào ạ ?

        • tungnt185tungnt185 says

          Lưu trữ database thì em cứ lưu trữ theo thứ tự id tăng dần còn lúc lấy ra em sort theo id ngược lại là được danh sách cái nào mới thêm sẽ ở trên đầu.

  4. Vinh says

    gửi anh,
    em có 1 câu hỏi này: Em có xây dựng dc 1 ứng dụng web api cho team mobile, nhưng vấn đề là em muốn 1 mã chứng thực, để khi team mobile gọi web api lên, cần có mã chứng thực đó thì mới get dữ liệu về được. Anh có thể chỉ em cách để làm được không?

      • Vinh says

        Gửi anh, em có 1 vấn đề khác rất mong anh chia sẻ. Thông thường khi anh thiết kế ứng dụng trên Asp.net MVC thì anh có sử dụng những cơ chế của MVC như MemberShip, thậm chí nếu ứng dụng đó có đăng nhập theo cơ chế Single sign on, hay anh sẽ viết lại toàn bộ theo ý mình. Bên công ty em, họ yêu cầu phải tự viết lại membership, thậm chí cả cái External Login. Anh có thể chia sẻ vài kinh nghiệm về vấn đề này cho em được không ?

        • tungnt185 says

          Hi Vinh,

          Cái membership và sau này là identity được Microsoft đầu tư phát triển với mục đích là giúp cho tất cả các ứng dụng có thể sử dụng được ngay authentication và authorization mà không cần phải mất công sức đi viết lại từ đầu. Tất cả các api này đã được các chuyên gia của Microsoft thiết kế và kiểm nghiệm qua hàng trăm ngàn ứng dụng, không có lý do gì lại đi viết lại phần này em ạ bởi vì suy cho cùng mình không thể pro hơn đội ngũ của Microsoft được.

          Theo ý kiến của anh thì bên em chỉ nên viết lại nếu ứng dụng của bên em có yêu cầu bảo mật hết sức đặc biệt mà membership hoặc identity không thể đáp ứng được. Tuy nhiên anh cũng chưa thấy yêu cầu nào đặc thù như vậy :)

          Regards.

          • Vinh says

            Gửi anh,
            Nếu chọn viết theo cơ chế Identity thì sẽ phát sinh database riêng của Microsoft. Trong trường hợp nếu dự án đòi hỏi dùng asp.net mvc với một hệ quản trị khác như Oracle, hay thậm chí phải làm việc với NoSQL như mongoDB thì mình nên giải quyết như thế nào hả anh ? Em cũng không rõ các bảng database của microsoft có phát sinh được trên Oracle không, đặc biệt nếu dùng mô hình Code first để phát sinh database.

          • tungnt185 says

            Hi em,

            Anh chưa thử bao giờ nhưng theo những gì anh biết thì Identity hoàn toàn có thể sử dụng được với MongoDB, Oracle…

            Hiện đã có các Provider cho các database này, nếu không có thì về mặt khả năng là hoàn toàn có thể tự viết được vì nó theo mô hình Provider:
            https://www.nuget.org/packages/MongoDB.AspNet.Identity/
            https://www.nuget.org/packages/AspNet.Identity.OracleProvider/1.0.0-alpha2

            Regards.

  5. Vinh says

    Gửi anh Tùng,
    Em có 1 thắc mắc. Công ty họ yêu cầu phải viết lại cái login bên thứ 3 như Facebook, Google giống với cái của Asp.net MVC. Anh có thể chia sẻ với em điều này được không ?

    • tungnt185 says

      Hi Vinh,

      Yêu cầu viết lại thì hơi rắn nhỉ, sao không reuse, nếu muốn viết lại thì em nên tìm hiểu về OAuth (Open Authentication) nhé.

      • Vinh says

        Gửi anh Tùng,
        Em đã thành công viết lại chức năng login Google. Em dùng google api để viết, dựa trên tutorial sau: http://blog.bigbasti.com/using-google-open-auth-login-in-asp-net-mvc-applications/. Nhưng có 1 vấn đề là khi em click vào nút login, thì chỉ có 1 user đăng nhập, user đó là tài khoản email của em. Em đã thử lại mấy lần mà chỉ có login được 1 account. Không biết anh đã từng làm việc với Google Api chưa ?

        • tungnt185 says

          Hi Vinh,

          Anh không hiểu lắm cái ý là chỉ đăng nhập được 1 account. Bởi vì mỗi một trình duyệt là một session nên sẽ chỉ lưu một phiên đăng nhập vào một ứng dụng. Em dùng 2 trình duyệt khác nhau thì sẽ có 2 phiên đăng nhập khác nhau. Đấy là cơ chế default của browser để giúp thuận tiện hơn khi chúng ta đã đăng nhập google thì ở tab nào trên trình duyệt cũng dùng được session google đấy luôn.

          Regards.

          • Vinh says

            Gửi anh Tùng,
            Vấn đề của em là như thế này: Khi em run project lần đầu tiên, em click vào nút login Google thì nó sẽ chuyển qua trang gmail, em login bằng account gmail thì nó sẽ chuyển về trang show thông tin cơ bản account google của em. Tuy nhiên khi em logout tài khoản google, thì em run project lần 2, em cũng click vào nút login thì thông tin cơ bản tài khoản của em show ra, kể cả em ko đăng nhập gmail. Và gần như lúc nào em click vào nút login Google thì nó sẽ chuyển qua trang show thông tin Google account của em, dù em ko login vào tài khoản Gmail, và em đã thử với hàng chục tab, 3 trình duyệt thì lỗi này vẫn xảy ra.
            Theo đúng cơ chế, thì khi mình click nút login Google, trang web sẽ chuyển qua trang đăng nhập google và sau đó trả về trang trước đó, đằng này em ko login nó vẫn luôn hiện thông tin.
            Em đoán là nó lưu cache, và em đã cài extension clear cache trên trình duyệt, nó vẫn xảy ra.

  6. Vinh says

    Gửi anh Tùng, trong web api khi trả về json thì em nhận được kiểu json như thế này
    {“$id”:”1″,”$values”:[{“$id”:”2″,”CatID”:2,”NameCat”:”Petrol”,”Active”:true},{“$id”:”3″,”CatID”:3,”NameCat”:”Bank”,”Active”:true},{“$id”:”4″,”CatID”:4,”NameCat”:”Food”,”Active”:true},{“$id”:”5″,”CatID”:9,”NameCat”:”Phone”,”Active”:true},{“$id”:”6″,”CatID”:11,”NameCat”:”Hospital”,”Active”:true},{“$id”:”7″,”CatID”:12,”NameCat”:”USB”,”Active”:true},{“$id”:”8″,”CatID”:15,”NameCat”:”Electric”,”Active”:true},{“$id”:”9″,”CatID”:16,”NameCat”:”Electric11″,”Active”:true}]}.

    Em muốn trả về json giống như trong link này: http://maps.googleapis.com/maps/api/directions/json?origin=10.752688,106.729485&destination=10.793237,106.652648&sensor=false&units=metric&mode=driving
    Json do google map trả về dễ nhìn, ko biết trong web api mình có thể làm dc giống như vậy không anh?

    • tungnt185 says

      Hi Vinh,

      Cái này chỉ là mặt hiển thị thôi mà em. Em có thể copy vào Visual Studio và format là nó hiển thị theo đúng format đẹp như vậy thôi.

      Regards.

      • Vinh says

        Gửi anh Tùng,
        anh đã từng làm dự án mà khi tổ chức cấu trúc dự án, mình tạo 1 solution mà có nhiều project con trong đó chưa anh? Em tính tổ chức 1 project giống kiểu như vậy, 1 project chính theo MVC, 1 project phụ dạng class library tên là Entity (chủ yếu là các model và dùng code first trong này phát sinh database luôn), 1 project khác cũng là class library với tên gọi Business (trong đây gồm nhiều interface và các class implement thực thi nghiệp vụ). bên Project chính thì em chỉ reference và gọi hàm lấy kết quả về. Nhưng em đang băn khoăn về vấn đề Deloy, vì chỉ tạo Project dạng Web application mới publish được.
        Vấn đề nữa là Business cũng reference Entity, lỡ như cái Project MVC gọi hàm bên Business, Business gọi Entity, trong khi chỉ có thể publish được thằng MVC thôi thì nó có bị gì không anh ?

        • tungnt185 says

          Hi em,

          Kiến trúc dự án như vậy là rất bình thường em ạ. Việc từ UI (MVC) reference tới Business và Entity không ảnh hưởng gì quá trình deploy cả. Em chỉ cần đảm bảo thuộc tính của các file dll reference trong UI là Copytolocal = true để nó luôn copy vào bin khi deploy là được.

          Regards.

          • Vinh says

            Gửi anh Tùng,
            lúc trước em có hỏi anh về vấn đề security trong Web api, anh có nói là dùng authorize để khi truy cập không đúng quyền thì chuyển qua trang login. Trong trường hợp Web api mình viết phục vụ cho dự án Cổng thanh toán trực tuyến, giống bảo kim ấy anh, lúc này mình cung cấp Web api cho 1 đối tượng nào đó ví dụ như Dev chẳng hạn, thì phải xây dựng bảo mật như thế nào hả anh ? Cần có api key hay token gửi từ client lên ko anh ? Theo em nghĩ mình sẽ overide 1 filter và cho nó lọc, mã ko đúng thì trả kết quả rỗng chẳng hạn. Em thấy trên mạng có 1 số trang chỉ cách bảo mật web api bằng chữ kí điện tử mà cách làm rất phức tạp.

    • says

      Thêm đoạn này trong file global hoặc trong file WebApiConfig nhé người đẹp ^^

      var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
      json.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;

  7. Hoang says

    Gửi a Tùng
    a ơi, sao khi chọn liên kết 2 bảng thì khi chạy project nó cứ hiển thị Exception ở hiển thị json ạ? :(
    1 bảng thì lại ko sao

    • tungnt185 says

      Hi em,

      Anh không hiểu lỗi exception như thế nào. Hiện thời anh thử trên project này có sử dụng 2 bảng thì mọi thứ vẫn bình thường.

    • tungnt185 says

      Hi Chau,

      Bạn muốn hỏi cách thức nào? Đơn giản là sau khi tạo service xong bạn publish ra một folder và cấu hình trên IIS thôi.

      Regards.

  8. Nguyen Huu Tam Chau says

    Minh cau hinh ISS dua nhung trang web html thi chay duoc . Nhung khi minh buil project thi minh khong biet cach build .

    Minh chay Publish di no noi Server name va site name . Minh khong ro thong tin nay .

    Tung co the huong dan chi tiet mot chut ve deloy ung dung Web API len server cho minh duoc khong .

    Hien tai minh co :

    Rat mong tung giup do .

    • tungnt185 says

      Hi Chau,

      Server là của riêng bạn hả hay bạn sử dụng shared host.
      Ok mình sẽ hướng dẫn trong bài viết sắp tới, chờ nhé.
      Vui lòng subscribe blog của mình để nhận thông báo bài viết mới.

      Regards.

  9. Nguyen Huu Tam Chau says

    Hien tai Server cua rieng minh. Co IP tinh va DNS rieng .

    Thanks Tung nhieu lam .

  10. Nguyen Huu Tam Chau says

    Hi Tung

    Tung oi . Web deloy Chau da lam duoc roi . Nhung ket qua the hien nhu sau :

    “CustomerID”: “sample string 1″,
    “CompanyName”: “sample string 2″,
    “ContactName”: “sample string 3″,
    “ContactTitle”: “sample string 4″,
    “Address”: “sample string 5″,
    “City”: “sample string 6″,
    “Region”: “sample string 7″,
    “PostalCode”: “sample string 8″,
    “Country”: “sample string 9″,
    “Phone”: “sample string 10″,
    “Fax”: “sample string 11″

    Khong ra dung data cua database .

    Tung giup Chau voi.

    Than .

    • tungnt185 says

      Chúc mừng bạn. Không ra đúng database là như thế nào bạn. Như hình trên thì đã trả về dữ liệu bảng Customer rồi. Châu cần kiểm tra lại code server xem đang trả về dữ liệu như thế nào?

    • tungnt185 says

      Hi Châu help chỉ là hướng dẫn cho bạn biết cách xây dựng api và dữ liệu sample như thế nào thôi. Đường dẫn service thật phải là như cái kình gửi cho bạn. Ko có help.

      Hiện thời đang có lỗi server bạn tắt customError là biết ngay thôi.

  11. Harry says

    Gửi anh Tùng, em có 1 vấn đề về server muốn hỏi anh. Ở công ty em có 1 con server dùng để testing, và em có up source lên server để chạy và test. Tuy nhiên làm sao để em có thể theo dõi được dữ liệu truyền vào từ phía client. Em lấy ví dụ: nếu chạy trên local, từ client em gõ api đi kèm 1 giá trị thì em debug được, vì máy có visual hỗ trợ. Nhưng trên server thì em không biết cách theo dõi xem dữ liệu đó đi như thế nào, không biết mình có cần cài đặt 1 tool quản trị nào trên server không anh ?

  12. Harry says

    Gửi anh Tùng, em có vấn đề này muốn hỏi anh. Chẳng là em nghe 1 vài anh Dev .Net nói là dùng entity framework sẽ làm việc truy xuất CSDL chậm. Không biết điều này có đúng không anh ? Nếu DB của mình ngày càng phình to, dữ liệu lên đến trăm ngàn record trở lên thì Entity Framework có đảm đương nổi không anh ?
    Sorry anh, đây là 1 câu hỏi không liên quan đến Web Api, hi vọng anh có thể chia sẻ vài kinh nghiệm của mình.
    Regards.

    • tungnt185 says

      Hi em,

      Về lý thuyết và thực tế thì đúng là EF performance thấp hơn ADO.NET thuần do bản chất nó cũng dùng thuật toán để sinh code ADO.NET nên thêm 1 tầng nữa làm performance giảm đi.

      Tuy nhiên nếu mình viết code T-SQL không tốt thì có khi performance lại không bằng EF. Hơn nữa thì việc maintain và phát triển nhanh thì EF chắc chắn là đơn giản hơn so với T-SQL do chúng là managed code nên đôi khi đó lại là một tiêu chí để người ta lựa chọn EF.

      Về câu hỏi của em dữ liệu hàng trăm ngàn record thì anh nghĩ cũng không phải là vấn đề lớn với EF, điều quan trọng hơn là truy vấn có phức tạp phải xử lý join nhiều hay không. Nếu phải xử lý quá phức tạp như các ứng dụng tài chính thì chắc là performance của EF sẽ tệ hơn.

      Một ví dụ điển hình là trang StackOverflow.com lưu lượng truy cập và xử lý khổng lồ như vậy mà nó dùng LINQ to SQL, tiền thân của EF.

      Nên lời khuyên của anh là tuỳ theo yêu cầu nghiệp vụ mình phải đánh giá để lựa chọn vì mỗi cái đều có điểm mạnh điểm yếu và phù hợp từng loại ứng dụng riêng không có lựa chọn nào là tốt cho tất cả được :)

      Regards.

  13. Harry says

    Gửi anh Tùng, em có thắc mắc này muốn hỏi anh. Khi em sử dụng Identity của Microsoft thì luôn phát sinh DB mẫu để mình sử dụng, trong đó có Table aspnetUser và aspnetRole có mối quan hệ là n-n, do vậy phát sinh 1 bảng trung gian để chứa id của aspnetUser và id của aspnetRole. Theo suy nghĩ của em, thì đâu nhất thiết phải là n-n mà phải là 1-n, trong đó cứ 1 Role sẽ có n User tương ứng nhưng 1 User chỉ tương ứng 1 role. Thông thường khi em design bảng Member và bảng Role thì em cũng để relationship là 1-n. Nên em không thật sự hiểu ý đồ của chuyên gia microsoft, liệu 1 member cũng có nhiều Role đến vậy hả anh ?

    Regards.

    • tungnt185 says

      Hi em cái này là hết sức bình thường giống như trong thực tế một người có thể làm nhiều vai trò công việc vậy: vừa là phó giám đốc kiêm trưởng phòng hành chính chẳng hạn.

  14. Harry says

    Gửi anh Tùng, em có 1 thắc mắc như sau: Lúc đi học em nghe thầy nói là trong thực tế khi thiết kế database thì không cần ràng buộc khóa ngoại vì làm như vậy việc truy vấn sẽ khó khăn, em nghĩ trừ khi dùng Nosql thì nếu dùng Sql server hay oracle mà không ràng buộc khóa ngoại thì đó đâu phải cơ sở dữ liệu quan hệ nữa rồi. Theo cách thầy em nói thì không biết có đúng không anh ?
    Ngoài ra còn 1 vấn đề nữa là em hay dùng identity để cho khóa chính tự tăng, nhưng cách này hình như có khả năng làm cho khóa trùng thì phải, em cũng không rõ lắm. Vậy khi thiết kế 1 database nói chung, mình có nên ràng buộc khóa ngoại không anh, ngoài ra vấn đề xử lý trùng khóa chính thì như thế nào hả anh ?

    Regards.

    • tungnt185 says

      Hi em,

      Về vấn đề không ràng buộc đây là bước phi chuẩn để đáp ứng vấn đề performance chứ không phải vấn đề truy vấn khó khăn gì cả. Cái này là bài toán đánh đổi tuỳ từng trường hợp và yêu cầu về nghiệp vụ để thiết kế em ạ. Không có một nguyên tắc chung nào hết.

      Thông thường thì sẽ thiết kế database có relation khoá để database đảm bảo tính toàn vẹn, còn nếu không em sẽ phải tự control việc này. Tuy nhiên cũng có các trường hợp ko thể tạo khoá ngoại relation như khi mình thiết kế 2 database tách biệt mà có mối liên hệ với nhau.

      Identity cho khoá chính nên dùng với những database độc lập ít cần đồng bộ với những database khác, còn nếu cần đồng bộ dữ liệu với những table khác, database khác hay server khác thì nên dùng kiểu uniqueidentifier (GUID) để đảm bảo luôn duy nhất. Anh ví dụ nếu database thiết kế identity thì rất có thể sẽ trùng khi mà nó lấy dữ liệu từ nhiều nguồn cập nhật vào. Thế nhưng uniqueidentity cũng có những điểm yếu khi so với identity như là dung lượng lớn hơn và performance kém hơn identity.

      Regards.

  15. Vinh says

    Gửi anh Tùng,
    Em có 1 thắc mắc này: ngoài EF được sử dụng phổ biến, thì còn có 1 ORM khá nổi tiếng do StackOverlow phát triển là Dapper. Em tham khảo trang này: http://www.c-sharpcorner.com/UploadFile/4d9083/performing-crud-operation-with-dapper-in-mvc/. Em thấy là trong dapper việc viết truy vấn phải lồng sql query vào, nếu vậy sao mình không sử dụng Ado.net luôn mà dùng dapper làm gì ? Em thấy Dapper được đánh giá là có performance nhanh hơn EF, nếu vậy sao mình không bỏ hẳn EF để chuyển sang dùng Dapper, vì EF vẫn là ORM khá phổ biến trên thế giới ?

    Thanks anh

    • tungnt185 says

      Hi Vinh,

      Cái này có thể so sánh như oto, xe máy vậy. Sao ta không chỉ chọn mua Toyota thôi mà lại còn chọn Ford, Honda, Trường Hải Auto… làm gì.
      – ADO.NET là công nghệ chính của Microsoft cho việc thao tác Database trước kia, mặc dù performance của nó là the best nhưng để viết được hàm trả về list object chẳng hạn thì sẽ phải viết tương đối nhiều code để lấy được dữ liệu ra và mapping thành các object, trên dưới 10 code line.
      – Dapper là công nghệ Open Source của StackOverflow nó được thiết kế để có performance tốt nhất và sử dụng đơn giản nhất như ở trong link em thấy chỉ có 1-2 dòng code. Tất nhiên nó based trên ADO.NET nên tốc độ có chậm hơn một chút.
      – EF là công nghệ mới nhất của Microsoft trong việc thao tác database, được MS duy trì và phát triển nên đương nhiên được quảng bá rầm rộ. Nó gần như loại bỏ việc viết code SQL mà quy hết về việc viết code c# linq rất tiện cho lập trình viên nhưng điều đó đồng nghĩa với performance khá thê thảm.

      Như em thấy đấy mỗi công nghệ có ưu nhược điểm riêng và tuỳ theo yêu cầu bài toán của mình mà lựa chọn. Giống như mua xe ấy tuỳ theo yêu cầu và túi tiền mà mình chọn Toyota, Honda hay Trường Hải Auto :)

      Regards.

  16. says

    Gửi anh Tùng.

    Anh cho em ý kiến việc sử dụng Web API cho website MVC.
    Hiện nay em đang viết 1 project MVC và em sử dụng Web API để thực hiện các method: GET/PUT/DELETE,… Vậy thì việc triển khai toàn dự án MVC bằng Web API này có nhanh hơn triển khai không dùng Web API không anh.
    Và vấn đề bảo mật dữ liệu của Web API thì sao anh. Vì em thấy nó khá hay.

    • tungnt185 says

      Chào Tuấn,

      Câu hỏi của em chưa chỉ ra là so sánh dùng Web API với công nghệ gì. Nếu em đã dùng MVC chỉ để làm ứng dụng web thì controller của em cũng đã đủ dùng rồi nhưng nếu em muốn dùng cả cho mobile app chẳng hạn thì nên sử dụng Web API.

      Vấn đề bảo mật thì rất yên tâm vì đây là công nghệ mới nhất của Microsoft nên được đầu tư rất kĩ lưỡng.

      Regards.

  17. says

    Em chào anh, Em có liên hệ với anh qua facebook. Em muốn nhờ anh trợ giúp về hàm login trong asp.net api. API được sử dụng với mục đính đăng nhập vào 1 app trên mobile. Mong anh trợ giúp và giải thích cho em. Em cảm ơn ạ.

  18. Nguyễn Văn Dương says

    Chào anh Tùng!
    Trên android mình muốn kết nối và lấy dữ liệu thông qua web services api này thì phải làm sao. Mong anh có bài hướng dẫn cho trọn vẹn. Cảm ơn anh!

  19. Thư says

    Cho em hỏi, em vừa cài Visual studio 2013 và làm đến bước “EF Designer from database “(nhưng trong máy của em thì không có “EF Designer from database” mà chỉ có Generate from database) thì sao vậy anh?

  20. PhươngNT says

    Hi anh Tùng.
    Anh Tùng có thể làm 1 tut về vấn đề Web API, Entity Framework Code First, Windows Form Application được không?

  21. Công Hiếu says

    Cho em hỏi nếu có 2 bảng được liên kết với nhau thì khi em trả về một danh sách thì bên client toàn bị lỗi. Có thể hướng dẫn cho em có cách nào được không ạ.
    Ví du có 2 bảng NHANVIEN và PHONGBAN nếu return List thì mặc định nó kèm theo PHONGBAN nhưng ở client em lại không lấy được

    • tungnt185 says

      Hi Hiếu,

      Em bị lỗi cụ thể là gì. Về nguyên tắc trả về List object related như vậy không có vấn đề gì cả.

      Regards.

    • Henry says

      khi bạn return vể 1 record có relationship với một bản khác, sẽ xảy ra lỗi khi hệ thống nó convert sang json để gửi về client, trước khi gửi về bạn nên select new một object chứa các thông tin cần thiết rồi trả object đó về client, như thế sẽ bảo mật cho dữ liệu của mình hơn. Hoặc bạn có thể tắt proxy gì đó trong EF

      • tungnt185 says

        Lỗi này là do bị circular reference, chủ yếu do dùng entity framework. Đúng như bạn nói nên tự tạo các class DTO hay còn gọi là ViewModel để trả về cho client vừa bảo mật vừa hiệu năng cao vừa dễ mở rộng :)

  22. long says

    Cảm ơn anh Tùng, bài viết rất bổ ích.
    Cho em hỏi 1 chút là dùng Web API này thì khi tương tác với cơ sở dữ liệu thì có nên dùng Stored Procedures không hay chỉ dùng 4 phương thức Get Post Put Delete là đủ ạ?

    • tungnt185 says

      Hi Long,

      Tùy bài toán của em. Nếu nghiệp vụ lấy dữ liệu phức tạp thì có thể dùng store để cho performance cao hơn.

      Cái này nó không liên quan lắm đến web api mà là liên quan đến entity framework. Em hoàn toàn có thể gọi store trong hàm get.

      Regards

      • Long says

        Cảm ơn anh đã trả lời câu hỏi của em. E phiền anh thêm 1 chút:
        – Get gọi vào Store thì sao truyền tham số vào được và nếu không được thì nên dùng Put hay Post a?
        – E tìm nhiều tài liệu để gọi vào Store trả ra dư liệu mãi chưa làm được, entity fr để tạo nhanh code thì báo lỗi.

  23. Mr. Cường says

    Bài viết của Anh Tùng rất hay. Anh Tùng cho hỏi, khi mình test trên VS2015 thì chạy OK, nhưng khi Publish để chạy thử với localhost (win server 2012 iis 8.0) thì khi truy cập “http://localhost/api/customers” báo lỗi {“Mesage”: “an error has occurred”} trong khi chạy với IIS Express thì vẫn OK. Không biết có phải tại cấu hình IIS 8.0 chưa đúng ko anh nhỉ? Mình đã enable toàn bộ Features của IIS lên rồi.

  24. says

    Câu hỏi 1: Anh ơi nhờ anh giúp em trả về array như dưới phải làm sao anh
    {“danhsach”: [
    {“khoahoc” : “Lap trinh iOS co ban” },
    {“khoahoc” : “Lap trinh iOS nang cao” },
    {“khoahoc” : “Lap trinh PHP&MySQL” },
    {“khoahoc” : “Joomla” }
    ]}
    Em tao API Entity chỉ tra về được danh sách nhưng em không biết cách nào để trả về danh sách có thêm chữ “danhsach” như ở trên nhờ anh giúp em .
    ——————————————————–
    Câu hỏi 2: Và 1 dang khác em chỉ tạo ra được danh sách bến dưới
    [{ nhóm 1, tên 1},{ nhóm 2, tên 2…….}]
    Nhưng bên app yêu cầu trả về kết quả như sau:
    [{list 1{nhóm 1, tên 1},
    list2{nhóm 2, tên 2}]

    Mong anh giúp em , em cảm ơn anh ra61r nhiều

    Em cảm ơn anh rất nhiều

    • tungnt185 says

      Chào em,

      Đầy là chỉ cách thiết kế class thôi. Em muốn trả về dạng danhsach:list thì chỉ cần 1 class kiểu như bên dưới:

      public class A
      {
      public List[B] Danhsach { get; set; }
      }

      public class B
      {
      public string Khoahoc { get; set; }
      }

      Sau đó trả về đối tượng A là được.

      Regards

    • tungnt185 says

      Hi bạn,

      Nếu thêm 1 trường mới trong SQL thì bạn cập nhật lại Entity Data Model, cập nhật tự động các thay đổi từ SQL sau đó sử dụng như bình thường bạn ạ.

      Regards

  25. says

    Chào anh ! E làm theo các bước của anh, nhưng khi test thì nó không ra dữ liệu gì cả, cũng không văng lỗi.
    Cho e hỏi là e phải fix bug như thế nào ạ ?
    Cám ơn a đã đọc !

    • tungnt185 says

      Hi Tuyên,

      Em nên kiểm tra lại xem Response Code của request là gì, xác định xem request đã lên được server chưa. Từ đó sẽ khoanh vùng để tìm hiểu chi tiết xem lỗi gì.

      Thanks

  26. Nguyen Chi Tinh says

    Bạn ơi cho mình hỏi dử liệu dài quá mà mình chỉ cùng lấy 8 row cuối cung thôi thì làm sau vây ?
    vd : select * top 8 ………….

Trackbacks

Leave a Reply to Tuấn Cancel reply

Your email address will not be published. Required fields are marked *

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.