Cách tạo WCF Service trả về JSON dùng cho Mobile App

Cách tạo WCF Service trả về JSON dùng cho Mobile App
4.3 (86.67%) 6 vote[s]

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:

  1. Trong Visual Studio 2013 chúng ta tạo mới 1 project web
  2. Thêm Item mới cho project và chọn WCF Service

  3. Xóa gen code mặc định của Visual Studio và bổ sung 2 method GetMessage và PostMessage như bên dưới

  4. Để 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)

  5. Bước cuối cùng là  Implement Interface để xử lý 2 hàm Get/Post Message như sau:

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 webHttpBindingrestBehavior (bật helpEnabled để phục vụ quá trình phát triển như ở bên dưới sẽ nói đến)

Đế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

Comments

  1. 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.

      • 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

            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.

    • 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

    • 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.

  2. 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.

      • 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 ạ.

        • 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é

          • 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. :(

  3. 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é.

  4. 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?

  5. 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.

Trackbacks

Leave a Reply to tungnt185 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.