Trong kỉ nguyên smartphone và cloud lên ngôi, các ứng dụng mobile giờ đây không những đòi hỏi giao diện đẹp, chất lượng tốt mà khả năng đồng bộ hóa với đám mây và giữa các thiết bị với nhau đã trở thành một xu thế tất yếu. Nếu bạn đang bắt tay xây dựng các ứng dụng kiểu này thì lời khuyên của tôi là hãy quan tâm đến các công nghệ xây dựng service đồng bộ dữ liệu ngay từ bây giờ.
Hiện nay có rất nhiều các công nghệ xây dựng service khác nhau nhưng trong bài viết này tôi sẽ hướng dẫn các bạn chi tiết các bước để có thể tạo ra các service sử dụng được trên các mobile app hoặc client khác như desktop app, web app… sử dụng công nghệ WCF của .NET Framework.
Tạo WCF service dạng REST
Để bắt đầu chúng ta sẽ tạo một WCF service dạng REST trả về JSON đơn giản để sử dụng được từ ứng dụng mobile, web, desktop… Cách tạo gồm 5 bước chi tiết như sau:
- Trong Visual Studio 2013 chúng ta tạo mới 1 project web
- Thêm Item mới cho project và chọn WCF Service
- Xóa gen code mặc định của Visual Studio và bổ sung 2 method GetMessage và PostMessage như bên dưới123456789101112namespace Tungnt.NET.WCFRestDemo{[ServiceContract]public interface IWCFRestDemo{[OperationContract]string GetMessage();[OperationContract]string PostMessage(string userName);}}
- Để sử dụng WCF service dạng REST thì trên Interface của WCF service ta cần cấu hình attribute cho 2 method này sử dụng WebGet (chỉ dùng GET dữ liệu) hoặc WebInvoke (dùng để GET hoặc POST dữ liệu)
(Lưu ý: 2 attribute này nằm trong System.ServiceModel.Web.dll nên ta cần add reference dll này trước)
1234567891011121314151617181920212223using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Web;using System.Text;namespace Tungnt.NET.WCFRestDemo{[ServiceContract]public interface IWCFRestDemo{[OperationContract][WebGet(RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)]//Tương tự [WebInvoke(Method="GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]string GetMessage();[OperationContract][WebInvoke(Method="POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]string PostMessage(string userName);}} - Bước cuối cùng là Implement Interface để xử lý 2 hàm Get/Post Message như sau:12345678910111213141516171819202122using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.Text;namespace Tungnt.NET.WCFRestDemo{public class WCFRestDemo : IWCFRestDemo{public string GetMessage(){return "Welcome to tungnt.net from GetMessage() WCF REST Service";}public string PostMessage(string userName){return string.Format("Welcome {0} to tungnt.net from PostMessage() WCF REST Service", userName);}}}
Cấu hình WCF REST Service
Ở phần trên chúng ta đã tạo ra được WFC REST service nhưng để sử dụng được thì chúng ta còn cần cấu hình service này để có thể trả về được dạng JSON thay vì trả về dạng mặc định là SOAP (XML).
Ở bước này chúng ta sẽ cấu hình WCF sử dụng webHttpBinding để cho phép WCF service trả về dạng REST (json).
Để biết về sự khác nhau giữa các loại service như WCF Service và WCF REST service các bạn hãy xem bài viết:
Ta chỉnh sửa web.config như sau: Thêm endpoint dùng webHttpBinding và restBehavior (bật helpEnabled để phục vụ quá trình phát triển như ở bên dưới sẽ nói đến)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="restBehavior"> <webHttp helpEnabled="true"/> </behavior> </endpointBehaviors> </behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> <services> <service name="Tungnt.NET.WCFRestDemo.WCFRestDemo"> <endpoint name ="RESTEndPoint" contract ="Tungnt.NET.WCFRestDemo.IWCFRestDemo" binding ="webHttpBinding" address ="rest" behaviorConfiguration ="restBehavior"/> </service> </services> </system.serviceModel> |
Đến đây WCF REST service đã sẵn sàng để sử dụng, ta hãy kiểm tra xem WCF REST service có chạy thật hay không
Right click vào WCFRestDemo.svc trong project explorer và chọn View In Browser như hình dưới
Thêm rest vào cuối URL như cấu hình endpoint address trong web.config và nhấn Enter chúng ta sẽ thấy kết quả như hình dưới đây:
Click service help page (do đã cấu hình helpEnabled = true trong web.config ở trên) để xem các phương thức rest có trong service này. Như vậy là chúng ta đã tạo và cấu hình thành công WCF REST Service để có thể sử dụng được trên các ứng dụng web/mobile.
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 để có thể tạo ra các WCF REST service trả về dạng JSON để 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… Đây là một định dạng đang rất phổ biến hiện nay trong thế giới Web/Mobile vì sự đơn giản và nhẹ nhàng cùng tính khả chuyển (cross-platform) cao vì vậy việc nắm được cách sử dụng nó đã trở thành một nhu cầu rất thiết thực của các lập trình viên web/mobile.
Hy vọng bài viết này sẽ giúp ích được cho các bạn trong quá trình xây dựng các ứng dụng của riêng mình. Trong các bài viết kế tiếp chúng ta sẽ cùng tìm hiểu cách thức sử dụng service này trên Web, Windows Phone, Windows App…
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 nhé. Nếu thấy hay hãy chia sẻ cho bạn bè của bạn nữa.
Happy coding. Stay tuned.
P/s: Source code example các bạn có thể download tại đây: WCFRESTDemo
Giap Nguyen says
Rất hay
tungnt185 says
Thanks bạn. Subscribe nhận bài viết mới qua email để ủng hộ blog của mình nhé.
Mr.Bong says
Em chào anh,
Em đang làm app sử dụng WCF service,em làm đến phần Đăng nhập (so sánh dữ liệu nhập từ textbox với dữ liệu trong DB) thì không biết làm ntn? Mong anh giúp đỡ.
Thank anh.
tungnt185 says
Hi em,
Em hãy sử dụng AuthenticationService của ASP.NET Membership, nó cung cấp sẵn các hàm Login, Logout cho em. Chi tiết xem ở đây nhé: https://tungnt.net/authentication-mobile-app-su-dung-asp-net-membership-provider/
Regards.
Mr.Bong says
Cảm ơn anh đã hồi đáp,nhưng có lẽ nó hơi cồng kềnh đối với app của em,em nghĩ phần Login chỉ cần dùng câu lệnh truy vấn DB là đc :)) .Tuy nhiên em đang vướng ở chỗ không biết là nên viết hàm validateInfo() ở Service hay là ở phía code app?
tungnt185 says
Hi em,
Microsoft đã cất công viết ra membership để phục vụ điều này và hàng trăm ngàn ứng dụng đã kiểm nghiệm nó. Nếu em muốn tự viết thì em sẽ phải đảm bảo mọi việc từ mã hoá password cho đến kiểm tra session của người dùng với từng phiên đăng nhập.
Lời khuyên của anh là vẫn nên dùng membership authenticationservice và tất nhiên mọi việc authentication thì đều phải thực hiện ở phía server rồi vì như thế mới đảm bảo tính bảo mật được.
Regards.
Mr.Bong says
Vâng,cảm ơn anh.
Mr.Bong says
Hi anh,
Em có đọc một bài viết về cách host WCF service trên IIS, em chưa thực sự hiểu được cơ chế hoạt động của nó, server liên lạc với client app qua IIS như thế nào? địa chỉ IP của mạng đang kết nối có vai trò như thế nào? có phải điện thoại và máy tính phải kết nối tới cùng một mạng thì mới test được app?
Một câu hỏi nữa em thắc mắc là mỗi lần thay đổi IP ( như kết nối các mạng wifi khác nhau) thì e lại phải thay đổi IP đã khai báo trong IIS và trong ServiceReference. có cách nào fix cứng được ko ạ?
Em cảm ơn!
tungnt185 says
Hi em,
IIS là web server cho ứng dụng .NET, còn cái em nói chắc là IIS Express dùng cho môi trường phát triển của Visual Studio. Client app và server liên lạc với nhau qua Request/Response HTTP message thôi. IP chính là địa chỉ của server, đương nhiên để kết nối được thì server và device phải cùng một mạng rồi.
Vì IP thay đổi nên mới phải sinh ra tên miền, domain để thay thế. Bình thường thì môi trường test ip mới thay đổi nên cần phải cập nhật servicereference chứ nếu đã mua domain và publish lên hót, sau đó trỏ domain đến host đó rồi thì servicereference chỉ dùng domain thôi. Không sợ vấn đề ip thay đổi nữa.
Hy vọng giải thích đc cho em hiểu.
Regards.
Mr.Bong says
Em hiểu rồi ạ. cảm ơn anh :))
tungnt185 says
Ok em,
Ủng hộ blog của anh bằng cách subscribe nhận bài viết mới qua email nhé.
Thanks
huy dam quang says
Hi anh, cho em hỏi là trường hợp WCF Service trả về một List có được hay không và cách viết thế nào ạ. Thanks anh!
huy dam quang says
Hi anh, cho em hỏi là trường hợp WCF Service trả về một List object có được hay không và cách viết thế nào ạ. Mong phản hồi. Thanks anh!
tungnt185 says
Hi em,
Việc trả về List object tương đối đơn giản với WCF. VD hàm GetMessage ở trên thay vì trả về String thì em trả về List như là List chẳng hạn.
Regards
chinhbao says
good,toi muoon ban tao 1 web WCF Them xoa sua trong va truyen web asp.net mvc
tungnt185 says
Hi bạn hãy mô tả rõ hơn nhu cầu của mình và hãy dành sự kính trọng hơn cho những người đã bỏ công ra chia sẻ cho bạn những bài viết hữu ích.
Xin cảm ơn.
Nguyên Anh Tuấn says
dạ em đang muốn sử dụng WFC Rest kết hợp với Html Aligity Pack nhưng mà khi em sử dụng HttpClient trong hàm PostMessage lại bị lỗi ở phương thức GetAsync không thể Await dù trên PostMessage em đã khai báo async, mong a giúp đỡ vẫn đề này ạ
tungnt185 says
Anh không hiểu câu hỏi của em. Async chỉ cần dùng ở phương thức httpclient.sendasync thôi mà. Đâu có phải khai báo gì trên wcf đâu.
tuannait says
dạ ý em là: app client của em, post data lên là: url site nguồn. Ở trên Service em sử dụng HttpClient để load html site nguồn về dùng html Agility pack để rút trích dữ liệu trả về.
Nhưng trong hàm đó a làm await nó bao lỗi a ạ.
string html = await client.GetStringAnysc(“uri”); ở đây ạ.
tuannait says
nó lỗi như này ạ
http://i.imgur.com/knM928E.png
tungnt185 says
Anh đã thử trên project của anh và mọi thứ bình thường. Em kiểm tra lại xem đã sử dụng đúng dll reference chưa nhé
tuannait says
dạ, em đã kiểm tra lại rồi ạ, em sử dụng thư viện System.Net.Http; add từ Nuget về. E sử dụng bình thường nhưng đến project này thì lỗi.
tungnt185 says
Cái này cũng hơi vô lý nhỉ, em thử tạo một project mới và thử lại xem sao.
tuannait says
anh cho em hỏi, cùng mạng lan em debug trên device được không a
tungnt185 says
Có thể được nhưng em phải tạo mạng wifi local để cả device và service chung một mạng.
thaidv says
Em dow code của Thầy về và run dùng Advanced Rest Client để test thì báo lỗi 405 Method Not Allowed,không trả về giá trị ạ.
tungnt185 says
Hi Thái em kiểm tra lại phương thức là GET hay POST.
Ở trong bài có một phương thức là GET và 1 phương thức là POST phải chọn đúng phương thức thì sẽ không báo lỗi như trên.
Tham khảo bài sử dụng Fiddler để test web service nhé.
Lương Từ says
Chào anh, em định viết một app di động bằng HTML5, JS, CSS (dùng Devextreme ) CDSL sẽ lè SQL server(2008). Theo tìm hiểu thì em biết nó không thể kết nối đến SQL Sever một cách trực tiếp được mà phải dùng đến Data service đúng không anh?
Vậy em cần phải dùng WCF data service truy xuất đến đến SQL server rồi chuyển sang dạng JSON sau đó đưa dữ liệu JSON đó hiển thị lên App như vậy đúng không anh?
tungnt185 says
Đúng vậy HTML, JS là phía client còn SQL Server là phía server. Để kết nối được client và server em cần sử dụng một công nghệ kết nối ở giữa mà ở đây đơn giản nhất là web service như wcf, web api.
Lương Từ says
Nhưng kiến thức em còn mơ hồ quá, em cần tìm những tài liệu như turtorial chuyển từ Wcf thành json và đọc json từ JS cụ thể là dùng devextreme nhưng lại thấy có ít sự hỗ trợ. Em nên tìm tòi từ đâu vậy anh?
tungnt185 says
Em cần học cách sử dụng Javascript để kết nối đến WCF service. Có thể tham khảo bài này của anh viết cho Web API cũng tương tự WCF service thôi: https://tungnt.net/download-va-upload-anh-su-dung-asp-net-web-api-tren-asp-net-mvc/
Lương Từ says
Dạ vâng, em cảm ơn anh
Hoang Du says
Chào bạn,
Cho mình hỏi cái này tý. Mình vừa thử tạo 1 WCF trên local thì chạy rất tốt. Tuy nhiên khi mình qua máy con thì chỉ thấy method lấy thông tin từ file XML thì chạy còn method connect với data SQL thì nó ko chạy. Trong khi đó máy con connect tới database bình thường.
tungnt185 says
Hi bạn,
Bạn nên sử dụng try…catch để log lỗi ra file rồi xem vấn đề là gì. Liên quan đến database thường là lỗi không kết nối được do đường dẫn hoặc quyền hành thôi.
Regards.