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)
- 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ưới
- 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:
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
Bước tiếp theo chúng ta chọn bảng Customers để làm việc và click Finish.
- Đến đây chúng ta đã chuẩn bị xong phần Model giờ là lúc tạo ra các Web API.
Right 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:
Tạ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
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.
- Ngoài 2 API default là Account, Values giờ đây chúng ta có thêm API về Customer như hình dưới.
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)
- 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
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 Fiddler và RESTClient để 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
1 | config.Formatters.Remove(config.Formatters.XmlFormatter); |
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
1 2 3 | var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); |
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
Hay quá. Cám ơn a.
Rất vui khi nó hữu ích với em. Share cho bạn bè để ủng hộ blog nhé. Thanks em.
rất hay, cảm ơn bạn !
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
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 ạ?
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é
chỗ add 1 bảng customer vào đó nếu cần nhiều bảng thì thế nào vậy bác
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.
e chưa thấy dùng gì đến SQL Server hả a?
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.
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
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.
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 ạ ?
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 ạ.
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 ạ ?
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.
ok thanks anh :))
Ko có gì em. Subscribe nhận mail khi có bài viết mới để ủng hộ blog của anh nhé
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?
Hi Vinh,
Đơn giản nhất là em mark Controller hoặc các Action thuộc tính Authorize để bắt buộc phải đăng nhập trước khi sử dụng được API. Nếu muốn bảo mật hơn nữa thì chỉ ra rõ Roles nào được quyền dùng. Chi tiết xem ở đây nhé: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
Regards.
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 ?
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.
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.
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.
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 ?
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é.
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 ?
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.
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.
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?
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.
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 ?
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.
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.
Hi Vinh,
Bảo mât thì phải phức tạp rồi
Trong trường hợp của em anh nghĩ là nên sử dụng HMAC Authentication như trong bài viết dưới đây này: http://bitoftech.net/2014/12/15/secure-asp-net-web-api-using-api-key-authentication-hmac-authentication/
http://stackoverflow.com/questions/11775594/how-to-secure-an-asp-net-web-api
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;
Thanks Trường đã trả lời hộ
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
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.
Hi anh, em có 1 web service này, GET và POST thì ok, nhưng khi e PUT thì nó không cho phép, phải giải quyết như thế nào vậy anh ?
http://techshopsolution.somee.com/api/Products
Hi em,
Về vấn đề ko put được thì có thể do lỗi của thằng webdav em thử remove nó trong web config ở đây xem đc ko: http://stackoverflow.com/questions/19162825/web-api-put-request-generates-an-http-405-method-not-allowed-error
Regards.
Hi anh, e đã thử nhưng ko được, nó vẫn không cho PUT, controller của e nè : string editProduct(int id, Products _product)
{
var _products = _pro.editProduct(id,_product);
return _products;
}
Cấu trúc controller có ảnh hưởng ko vậy anh ?
Hi em, anh định thử nhưng hình như server http://techshopsolution.somee.com/api/Products die rồi
Cho minh hoi cach build Web API nay len sever 2008 .
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.
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 .
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.
Hien tai Server cua rieng minh. Co IP tinh va DNS rieng .
Thanks Tung nhieu lam .
Ok bạn stay tuned.
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 .
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?
Hi Tung
No khong ra du lieu . CHi hien ” sample string” khong ha .
Thanks
Bạn cho mình đường dẫn mình kiểm tra thử
http://192.168.222.254/trangchu3
Tung kiem thu dum Chau .
http://192.168.222.254/trangchu3
113.161.85.213/trangchu3
Sorry Tung dia chi cuoi moi dung
Hi mình thử theo url này thì thấy lỗi: http://113.161.85.213/trangchu3/api/customer
Đây là lỗi server vui lòng để CustomError=off trong web.config để xem chi tiết lỗi là gì.
/trangchu3/Help/Api/GET-api-Customer . Co chu help nua Tung oi .
http://113.161.85.213/trangchu3/Help/Api/GET-api-Customer
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.
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 ?
Hi em hoàn toàn có thể được. Tuỳ theo nhu cầu em muốn như thế nào. Em có thể theo dõi ở tầng database dùng SQL Profiler hoặc ở tầng application dùng ASP.NET Web API Tracing, xem hướng dẫn ở link này nhé:
http://www.codeguru.com/csharp/.net/using-tracing-in-asp.net-web-api.htm
Regards.
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.
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.
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.
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.
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.
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.
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
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.
Gửi anh Tùng,
cho em hỏi là trong mvc có cơ chế single sign on, kiểu giống login Facebook hay login Google đó anh. Ví dụ em có nhiều domain khác nhau nhưng chạy cùng 1 DB, em login domain thứ 1 thì các domain khác tự động đăng nhập luôn.
Thanks and Best Regards,
Vinh Dang
Anh chưa hiểu câu hỏi của em?
tao ra 1 cai gate, gate nay tro toi sub-domain
huong dan o link nay http://www.codeproject.com/Articles/429166/Basics-of-Single-Sign-on-SSO
Thanks bạn Simpay đã trở lời hộ mình
Anh Tùng có thể làm 1 tut về vấn đề bảo mật Web API được không?
Hi Mạnh,
Để anh sắp xếp lại thời gian sẽ publish bài viết về vấn đề này sớm nhất có thể nhé.
Regards
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.
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.
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 ạ.
Trên mạng có hướng dẫn rất nhiều về vấn đề này, keyword là: token based authentication using asp.net api2
Thanks Henry đã trả lời hộ mình nhé
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!
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?
Chào Thư,
Em có thể sử dụng Generate From Database cũng được hoặc cài tool này để có EF Designer From Database:
http://www.microsoft.com/en-us/download/details.aspx?id=40762
Regards.
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?
Hi Phương,
Anh sẽ viết bài này ngay khi có thể, subscribe blog để nhận thông báo nhé.
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
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.
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
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
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à đủ ạ?
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
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.
Cảm ơn bài viết rất giá trị.
Các phần comment cũng rất tuyệt.
Sub
Thanks Thạch, rất vui vì bài viết có ích với bạn.
Ủng hộ blog của mình bừng cách subscribe blog nhé
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.
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
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
Nếu table trong sql database thêm 1 field nữa thì sao?
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
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 !
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
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 ………….
Hi Tinh,
Bạn chỉ cần sắp xếp dữ liệu ngược lại order desc -> sau đó select top 8 là được.
Regards.
sao để gọi cái link của api đó qua bên App được ạ…..