Sunday, October 28, 2018

Các cách để override hàm trong C#
Có 2 cách để override hàm trong C#
1. Lớp cha viết bình thường, lớp con dùng từ khóa new
2. Lớp cha dùng từ khóa virtual lớp con dùng từ khóa override
Hai cách này có gì khác nhau??



- new dùng để hide một member ở base class
- virtual - override dùng để extend một hàm của base class

Ví dụ cho dễ hiểu:

public class Parent
{
public virtual void SayHello()
{
Console.WriteLine("Say hello from Parent");
}
public void SayGoodbye()
{
Console.WriteLine("Say goodbye from Parent");
}
}
public class Child : Parent
{
public override void SayHello()
{
Console.WriteLine("Say hello from Child");
}
public new void SayGoodbye()
{
Console.WriteLine("Say goodbye from Child");
}
}
Child child = new Child();
child.SayHello(); // Say hello from Child
child.SayGoodbye(); // Say goodbye from Child
Console.WriteLine("------------------");
Parent parent = (Parent)child; // OR Parent parent = new Child();
parent.SayHello(); // Say hello from Child
parent.SayGoodbye(); // Say goodbye from Parent
Console.Read();

Thien Nguyen
C# khi nào thì nên dùng == khi nào nên dùng Equals để so sánh

Trong C#, khi nào thì nên dùng == khi nào nên dùng Equals để so sánh. Hai cái này khác nhau sao?



Sau đây là 1 số ý kiến trên group .NET Core VN:

Operator "==" được dùng để so sánh hai đối tượng, nó sẽ kiểm tra xem các đối tượng về cơ bản có tham chiếu đến cùng một địa chỉ nhớ hay không
Còn equals được override để lấy những phương thức cần thiết nhờ đó nội dung của đối tượng được so sánh thay vì địa chỉ của đối tượng

------------------------------------------------------------------

== là so sánh 2 giá trị trên stack, đối với value type thì nó so sánh đúng 2 giá trị nội dung lưu trực tiếp trên stack.

Đối với reference type thì giá trị trên stack chỉ chứa địa chỉ trỏ qua vùng nhớ heap, nếu dùng == trong ngữ cảnh này nó chỉ đảm bảo 2 biến đang trỏ về cùng 1 vùng nhớ heap. Như vậy để so sánh nội dung phức tạp chứa bên vùng nhớ heap, người ta cần phải dùng hàm Equal() hoặc là định nghĩa lại logic cho toán tử ==, ví dụ 2 object kiểu User thì bằng nhau nghĩa là chỉ cần so sánh 2 cái user id thôi chẳng hạn.

Kiểu string cũng là reference type, nếu bạn dùng custom == cũng được, nhưng nó so sánh đủ thứ chuyện từ hoa thường cho tới culture..., như vậy performance không tốt.

Nếu bạn chỉ cần so sánh 2 string với nhau không phân biệt hoa thường và culture này nọ, hàm string.Equals() sẽ cho bạn truyền thêm những tham số options như ignore case... giúp quá trình so sánh giảm thiểu được những so sánh không cần thiết và tăng tốc độ.

Nhưng chú ý thêm nếu bạn dùng entity framework mà trong biểu thức lambda expression, nếu bạn dùng string.Equals() thì nó lại không convert qua sql statements được bởi vì không có hàm tương xứng, cho nên lúc này lại buộc phải dùng ==

------------------------------------------------------------------

Đôi khi ko dùng dc trong LINQ vì, LINQ sẽ bien dịch đoạn query c# đó thành sql statement, 
1. thứ nhất, cái object call equal bi null
2. thứ 2, nội dung hàm equal (tùy nha, override dc) nhiều khi impossible de dich ra sql statement nen get exception thoi (example, sâu ben trong equal call 1 hàm gi do phức tap trong code c# mà ko dich ra linq dc)

Saturday, December 16, 2017

Những điểm mới trong Visual Studio 2017 ver 15.6
Phiên bản 15.6 beta update của Microsoft’s Visual Studio 2017 IDE, giờ đã có thể tải về. Đồng thời, Visual Studio phiên bản 15.5 cũng đã được tung ra chính thức, không còn ở giai đoạn beta nữa.

Các tính năng trong Visual Studio 2017 15.6 beta

Ngày 7 tháng 12 Microsoft đã tung ra phiên bản beta Visual Studio 2017 15.6. Các tính năng của nó bao gồm:
  • CPU Usage tool giờ sẽ hiển thị source-line highlighting dựa trên tầng suất sử dụng một đoạn code nhất định.
  • Sử dụng tính năng IntelliSense cho Python code sẽ không còn cần một database hoàn chỉnh.
  • Team Explorer collaboration tool đã có cải thiện tính năng Git tags, với Tags tile cho phép xem toàn bộ tags trong một repo. Developer cũng có thể xóa và push tags và tạo một branch mới từ tags.
  • Nút truy cập vào App Authentication Extension, dùng để tinh chỉnh một thiết bị cho các setting bảo mật khi làm việc với Azure cloud, được đưa vào setup chính.
  • Tính năng Real-time test discovery, dành cho các projects sử dụng Roslyn compiler để tìm kiếm các test và phổ biến Test Explorer, sẽ được mở ở chế độ default kể từ phiên bản 15.5.
  • Với quá trình phát triển của Azure cloud, Visual Studio có hỗ trợ phân phối liên tục tới Azure cho Team Foundation Version Control, Git SSH remotes, và web apps cho containers.
  • WCF Web Service Reference liên kết với bên cung cấp dịch vụ giờ đã hỗ trợ service reference có sẵn, giúp đơn giản hóa quá trình tạo lại client proxy code cho một web service được nâng cấp.

Visual Studio 2017 15.5 đã có bản chính thức

Visual Studio 2017 15.5 đã có thể tải về từ ngày 4 tháng 12, với tính năng load nhanh hơn trong C# và Visual Basic.
Visual Studio 2017 15.5’s compiler và standard library cũng hỗ trợ cho C++ 17 standard:
Compiler hỗ trợ khoảng 75% của 17 tính năng của C++, bao gồm structured bindings, constexpr lambdas, inline variables, và float expressions.
C++ code generation đã được cải thiện
C++ Core Guidelines mới sẽ bảo đảm chất lượng của C++ code.
Hỗ trợ cho Google Test Framework assists với Google Test C++ unit tests
Linux C++ hỗ trợ cross-compilation cho ARM microcontrollers.
Cũng trong Visual Studio 15.5:
Với Angular 2, platform này sẽ hỗ trợ inline và .ngml template files, thông qua dịch vụ ngôn ngữ (language service) của Angular 2. Tính năng này hỗ trợ quá trình phát triển của TypeScript và JavaScript.
Với TypeScript và JavaScript language service, lỗi khiến cho sử dụng nhiều memory hơn dự định đã được fix. Lỗi trên cũng có khả năng khiến load sai phiên bản TypeScript trong multiproject. Để cải thiện hiệu năng và tính an toàn trong các project lớn, Only Analyze Projects chứa Files Opened trong Editor checkbox đã được thêm vào trang JavaScript/TypeScript Text Editor Project Options.
IntelliTrace thêm hỗ trợ ASP.Net app với khả năng chạy IIS (Internet Information Services) Express.
Cho phép developer chạy các command trên một hệ thống từ xa trong Visual Studio Connection Manager. Developer cũng có thể copy sử dụng system trên.
F# Language Support checkbox trong .Net desktop development workload đã được đổi tên thành F# Desktop Support.
F# language support được cài đặt sẵn với một workload  cần có .Net Core 2.0. F# .cũng bao gồm .Net Core 2.0 SDK.
Nó cũng hỗ trợ phiên bản beta của Language Server Protocol, vốn cho phép developers sử dụng ngôn ngữ mà vốn không được hỗ trợ trên Visual Studio. The Language Server Protocol beta được coi như là một extension trên Visual Studio Marketplace.  
Quản lí bảo mật, dành cho việc xác định bí mật như database connection streams và web service keys.
Xamarin Live Player, dành cho việc deploy và debug mobile apps liên tục sử dụng Visual Studio và một thiết bị iOS hoặc Android.
Khả năng dùng .Net Core, phiên bản cross-platform của .Net, với Azure Functions serverless computing platform.
Hỗ trợ cho Git submodules và Team Explorer.
Techtalk via Infowold

Saturday, July 1, 2017

Sự khác biệt giữa List,IList, IEnumerable trong lập trình C#
Trong lập trình C# việc sử dụng danh sách bao gồm tập các dữ liệu từ dạng đơn giản đến phức tạp để lưu trữ thông tin là rất lớn.
Trong bài viết này sẽ đề cập sự khác biệt giữa các kiểu làm việc với danh sách:

1. List
2. IList
3. IEnumerable



Sau đây là đặc điểm và cách thức sử dụng của các kiểu trong C#:

- IEnumerable<T>: Là một lớp giao diện có thể cho lớp khác kế thừa hoặc cài đặt từ nó. Nó không cho phép truy xuất trực tiếp và chỉ được phép đọc (readonly). Trong trường hợp lấy về một danh sách đọc để hiển thị mà không có nhu cầu làm thay đổi dữ liệu đó, đặc biệt sử dụng foreach thì người ta có thể sử dụng IEnumberable.

- ICollection<T> kế thừa từ IEnumerable<T> nhưng nó cho phép thêm (add), xóa (remove) khi thao tác với tập sử dụng nó. ICollection cũng không cho phép truy xuất trực tiếp phần tử thông qua chỉ số (index).

Thursday, June 22, 2017

Xây dựng Web Service dùng API RESTful Service(phần 3)
Trong bài này Tui hướng dẫn các bạn cách sử dụng 2 công cụ HttpRequester (firefox addon) và Postman (chrome addon) 
  1. Cách sử dụng HttpRequester.
Bạn mở trình duyệt Firefox, vào google tìm từ khóa “httprequester addon” hoặc vào link: https://addons.mozilla.org/en-US/firefox/addon/httprequester/, bạn nhấn Add to Firefox:
h70-0Bạn tiến hành cài, cài xong khởi động lại trình duyệt Firefox, nhìn vào góc phải trên cùng trình duyệt:
h70-1Bạn bấm vào biểu tượng đó, chương trình HttpRequester sẽ xuất hiện như hình dưới đây:
h70-2Mục URL: Nhập URL Web API của bạn vào (http://localhost:8888/api/food). Bạn nhấn GET, chương trình sẽ lấy toàn bộ danh sách Food vào màn hình bên phải (bạn quan sát sẽ thấy).
Để Test lấy 1 Food theo mã nào đó bạn làm như sau:
h70-3Bạn vào tab Parameters, nhập tên biến + giá trị rồi nhấn Add. Sau đó bấm nút GET để lấy dữ liệu, như bạn quan sát đó Tui nhập id=15 thì chương trình lấy ra được Food “Hột mít vùi tro”.
-Test HTTP POST:
h70-4Đối với POST bạn cũng vào Parameters, nhập đủ parameters (phải giống như viết trong Web API), sau đó nhấn nút “POST”, bạn thấy kết quả trả về là true—> tức là thêm thành công. Bạn có thể test lại chức năng HTTP GET để xem lại kết quả thêm mới này.
Trường hợp PUT tương tự bạn tự làm.
Giờ Tui làm tiếp trường hợp Delete:
h70-5Trong combobox, bạn chọn DELETE, nhập Parameter rồi bấm Submit, thấy kết quả là true==> xóa thành công.
2.Cách sử dụng Postman.
Mở trình duyệt Chrome, tìm từ khóa “postman plugin”, hoặc https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en tiến hành cài đặt, sau khi cài thành công:
h70-6Kích hoạt postman để sử dụng.
Để lấy toàn bộ dữ liệu (HttpGet) ta chọn Get như hình dưới đây:
h70-7Để lấy 1 Food theo mã ta làm theo các bước dưới đây (Ví dụ lấy Food có id=1):h70-8Để sử dụng HttpPost (tạo Food mới) ta làm theo các bước dưới đây:
h70-9Ở trên khi bấm Send, trả về true==> thêm Food thành công.
Để xóa một Food có mã bất kỳ:
h70-10Trên đây là cách sử dụng HttpRequester và Postman, 2 công cụ này rất hiệu quả giúp chúng ta kiểm tra quá trình thực hiện HttpPost,HttpGet,HttpPut,HttpDelete trước khi triển khai vào hệ thống thực.
Chúc các bạn thành công.
Xây dựng Web Service dùng API RESTful Service(phần 2)
Trong bài này Tui sẽ hướng dẫn chi tiết cách tạo Web API, cách cấu hình IIS, cách sử dụng công cụ Postman(với những ai dùng chrome), cách sử dụng HttpRequester (với những ai dùng Firefox). Postman và HttpRequester là một trong những công cụ hiệu quả nhất để TEST coding của ta, nếu code của ta pass qua được công cụ này thì có thể kết luận rằng Webservice của ta chắc chắn hoạt động tốt.
Để cho có cảm giác Tui sẽ tạo một cơ sở dữ liệu SQL Server, WebAPI sẽ tương tác dữ liệu này bằng cách sử dụng LinQ to SQL:
Bước 1: Tạo cơ sở dữ liệu tên “dbFood”, có một bảng “Food” gồm 4 cột (id để auto) như dưới đây:
h69-0Các bạn có thể tải SQL Script ở đây để tạo CSDL cho lẹ: http://www.mediafire.com/download/48dkwoqka2e1w07/dbFood.sql
Bước 2: Tiến hành viết Web API
Để tạo Project sử dụng Web API có nhiều cách tạo, ở đây Tui sử dụng cách đơn giản nhất để các bạn bớt rối.
Từ Visual Studio 2013 vào menu File/chọn new/ chọn Project:
h69-1Sau khi chọn Project, màn hình sau xuất hiện:
h69-2Chọn các cấu hình như trên, đặt tên Project là “FoodServer” rồi nhấn OK.
Project mặc định ban đầu như sau:
h69-3Giờ ta tiến hành tạo LinQ to SQL cho CSDL dbFood để dễ xử lý như sau:
Bấm chuột phải vào Project/ chọn :
h69-4Màn hình tạo tên LINQ to SQL hiển thị lên, ta tạo tên rồi nhấn OK:
h69-5(chú ý đôi khi bạn sẽ không thấy LINQ to SQL Classes ở màn hình này), nếu không thấy thì chọn New Item:
h69-6Ta chọn các mục giống như bên dưới, tìm tới LINQ to SQL Classes rồi đặt tên DBFood tương tự như trên:
h69-7Cả 2 cách cuối cùng cũng trạo được DBFood LINQ như sau:
h69-8– Ta tiến hành cấu hình để kéo Cơ sở dữ liệu vào làm các lớp tương tác:
Bạ mở Server Explorer (vào menu View/Server Explorer), bấm chọn theo các bước như bên dưới (lệ thuộc vào Server của bạn mà chọn Server name, User đăng nhập cho phù hợp):
h69-9Khi khi bấm OK, bạn sẽ thấy Server Explorer có thêm mục sau:
h69-10Bạn kéo thả bảng Food vào mục bên phải như hình trên.
Tiếp theo bạn tạo 1 thư mục (tên gì cũng được), ở đây Tui đặt đại tên Controllers (bấm chuột phải vào Project/chọn Add/chọn New Folder):
h69-11Sau khi thư mục Controllers được tạo ra, bạn bấm chuột phải vào Thư Mục này rồi chọn Add/Controller..:
h69-12Sau khi bạn chọn Controller… màn hình sau xuất hiện:
h69-13Ta chọn Web API 2 Controller – Empty rồi bấm Add, Visual sẽ hiển thị màn hình đặt tên cho Controller:
h69-14Mặc định là chữ Default, bây giờ bạn đổi lại thành Food (thường ta làm API cho bảng nào thì lấy tên bảng đó), đó là lý do vì sao Tui đặt là Food:
h69-15Tập tin FoodController.cs sẽ được tạo ra, nhưng ta chỉ lấy Food(bỏ chữ Controller đằng sau đi) để tương tác (đây là cơ chế hoạt động). Ta xem cấu trúc Controller được tạo ra:
h69-16Cấu trúc có gì?
  • File WebApiConfig.cs được sinh ra trong thư mục App_Start, bạn để ý  routeTemplate: “api/{controller}/{id}”, tức là khi ta dùng thì viết: “api/food” để lấy toàn bộ danh sách, hay “api/food/3” để lấy chi tiết  1 Food có mã là 3.
  • File FoodController.cs kế thừa từ ApiController
Bây giờ ta tiến hành viết các chức năng (viết trong file FoodController.cs) :
  • HttpGet: Truy vấn thông tin
  • HttpPost: Thêm mới thông tin
  • HttpPut: Thay đổi thông tin
  • HttpDelete: Xóa thông tin
Trước tiên ta làm HttpGet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
 
namespace FoodServer.Controllers
{
public class FoodController : ApiController
{
///
 
<summary>
/// Dịch vụ lấy toàn bộ Food
/// </summary>
 
 
/// <returns></returns>
[HttpGet]
public List<Food> GetFoodLists()
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.ToList();
}
///
 
<summary>
/// Dịch vụ lấy 1 Food theo khóa chính nào đó
/// </summary>
 
 
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public Food GetFood(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.FirstOrDefault(x => x.id == id);
}
}
}
Chú ý là Web API nó không quan tâm tới tên phương thức (viết tên gì cũng được, nó tự động lấy chính xác Service yêu cầu), (không cho phép trùng tên biến). Ví dụ nếu bạn cố tình tạo thêm 1 hàm:
1
2
3
4
5
6
[HttpGet]
public Food GetFood_test(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.FirstOrDefault(x => x.id == id);
}
Khi chạy sẽ báo lỗi ngày (vì hệ thống không quan tâm tên hàm), nó thấy 2 biến id giống nhau ở trên 2 hàm nó sẽ không biết dùng cái nào (vì chúng cùng nhóm HttpGet). Cụ thể là lỗi sau:
“Multiple actions were found that match the request: 
GetFood on type FoodServer.Controllers.FoodController
GetFood_test on type FoodServer.Controllers.FoodController”
Tiếp theo ta viết HttpPost (thêm mới):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
///
 
<summary>
/// Dịch vụ này để thêm mới 1 Food, các thông số gửi từ client lên
/// </summary>
 
 
/// <param name="name">tên </param>
/// <param name="type">loại-nhóm</param>
/// <param name="price">đơn giá</param>
/// <returns>true thành công, false thất bại</returns>
[HttpPost]
public bool InsertNewFood(string name,string type,int price)
{
try
{
DBFoodDataContext db = new DBFoodDataContext();
Food food = new Food();
food.name = name;
food.type = type;
food.price = price;
db.Foods.InsertOnSubmit(food);
db.SubmitChanges();
return true;
}
catch
{
return false;
}
}
Để chỉnh sửa thông tin ta viết HttpPut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
///
 
<summary>
/// Dịch vụ chỉnh sửa thông tin
/// </summary>
 
 
/// <param name="id">mã food muốn sửa</param>
/// <param name="name">tên mới</param>
/// <param name="type">loại mới</param>
/// <param name="price">giá mới</param>
/// <returns></returns>
[HttpPut]
public bool UpdateFood(int id,string name,string type,int price)
{
try
{
DBFoodDataContext db = new DBFoodDataContext();
//lấy food tồn tại ra
Food food = db.Foods.FirstOrDefault(x=>x.id==id);
if (food == null) return false;//không tồn tại false
food.name = name;
food.type = type;
food.price = price;
db.SubmitChanges();//xác nhận chỉnh sửa
return true;
}
catch
{
return false;
}
}
Cuối cùng để xóa 1 Food ta viết HttpDelete như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
///
 
<summary>
/// Dịch vụ dùng để xóa Food có id
/// </summary>
 
 
/// <param name="id">id muốn xóa</param>
/// <returns></returns>
[HttpDelete]
public bool DeleteFood(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
//lấy food tồn tại ra
Food food = db.Foods.FirstOrDefault(x => x.id == id);
if (food == null) return false;
db.Foods.DeleteOnSubmit(food);
db.SubmitChanges();
return true;
}
Sau cùng ta có coding tổng hợp của FoodController như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
 
namespace FoodServer.Controllers
{
public class FoodController : ApiController
{
///
 
<summary>
/// Dịch vụ lấy toàn bộ Food
/// </summary>
 
 
/// <returns></returns>
[HttpGet]
public List<Food> GetFoodLists()
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.ToList();
}
///
 
<summary>
/// Dịch vụ lấy 1 Food theo khóa chính nào đó
/// </summary>
 
 
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public Food GetFood(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.FirstOrDefault(x => x.id == id);
}
///
 
<summary>
/// Dịch vụ này để thêm mới 1 Food, các thông số gửi từ client lên
/// </summary>
 
 
/// <param name="name">tên </param>
/// <param name="type">loại-nhóm</param>
/// <param name="price">đơn giá</param>
/// <returns>true thành công, false thất bại</returns>
[HttpPost]
public bool InsertNewFood(string name,string type,int price)
{
try
{
DBFoodDataContext db = new DBFoodDataContext();
Food food = new Food();
food.name = name;
food.type = type;
food.price = price;
db.Foods.InsertOnSubmit(food);
db.SubmitChanges();
return true;
}
catch
{
return false;
}
}
///
 
<summary>
/// Dịch vụ chỉnh sửa thông tin
/// </summary>
 
 
/// <param name="id">mã food muốn sửa</param>
/// <param name="name">tên mới</param>
/// <param name="type">loại mới</param>
/// <param name="price">giá mới</param>
/// <returns></returns>
[HttpPut]
public bool UpdateFood(int id,string name,string type,int price)
{
try
{
DBFoodDataContext db = new DBFoodDataContext();
//lấy food tồn tại ra
Food food = db.Foods.FirstOrDefault(x=>x.id==id);
if (food == null) return false;//không tồn tại false
food.name = name;
food.type = type;
food.price = price;
db.SubmitChanges();//xác nhận chỉnh sửa
return true;
}
catch
{
return false;
}
}
///
 
<summary>
/// Dịch vụ dùng để xóa Food có id
/// </summary>
 
 
/// <param name="id">id muốn xóa</param>
/// <returns></returns>
[HttpDelete]
public bool DeleteFood(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
//lấy food tồn tại ra
Food food = db.Foods.FirstOrDefault(x => x.id == id);
if (food == null) return false;
db.Foods.DeleteOnSubmit(food);
db.SubmitChanges();
return true;
}
}
}
Bây giờ ta tiến hành cấu hình Port để test trên IIS express hoặc bạn cấu hình IIS full. Trong bài này Tui hướng dẫn cách sử dụng IIS Express.
Bạn bấm chuột phải vào FoodServer Project/ chọn Properties:
h69-17Tại màn hình Properties / chọn mục Web:
h69-18Bạn cấu hình như trên, Port tui chỉnh là 8888, bạn chọn Port nào cũng được, nhưng thường là 4 chữ số.
Sau đó bấm Create Virtual Directory:
h69-19Nếu Visual thông báo màn hình trên coi như bạn thành công.
Bây giờ ta thử chức năng HttpGet để lấy toàn bộ Food và lấy 1 Food theo id bất kỳ:
F5 để chạy Project:
h69-20Bạn chỉnh lại: http://localhost:8888/api/food để lấy toàn bộ Food:
h69-21Để lấy 1 Food có mã bất kỳ:
Ví dụ: Lấy Food có mã id=15: http://localhost:8888/api/food/15
h69-23Ta cần phải biết các công cụ để test HttpGet,HttpPost,HttpPut và HttpDelete.
Bài kế tiếp Tui sẽ hướng dẫn cách dùng công cụ Postman và HttpRequester để xử lý 4 tác vụ trên.
Bây giờ các bạn hãy làm theo hướng dẫn này để có thể tạo được 1 Web API hoàn chỉnh, test trước phần HttpGet mà Tui đã trình bày ở trên trước.
Các bạn tải source code FoodServer ở đây: http://www.mediafire.com/download/c24sm4hg19v8grz/FoodServer.rar
Chúc các bạn thành công.