C# Cơ bản .NET Core §1 Cài đặt, chương trình C# đầu tiên §2 Biến, kiểu dữ liệu và nhập/xuất §3 Toán tử số học và gán §4 So sánh, logic và lệnh if, switch §5 Vòng lặp for, while §6 Phương thức - Method §7 Chuyển số thành chữ §8 Phương thức - Delegate §9 Lớp - Class §10 Namespace §11 Partial, Nested §12 Kiểu giá trị, tham chiếu §13 Kiểu vô danh và dynamic §14 Biểu thức lambda §15 Event §16 Hàm hủy - Quá tải toán tử - thành viên tĩnh - indexer §17 null và nullable §18 Mảng §19 Chuỗi ký tự §20 Tính kế thừa §21 Phương thức khởi tạo §22 Tính đa hình - abstract - interface §23 Struct và Enum §24 Ngoại lệ Exeption §25 IDisposable - using §26 File cơ bản §27 FileStream §28 Generic §29 Collection - List §30 SortedList §31 Queue / Stack §32 Linkedlist §33 Dictionary - HashSet §34 Phương thức mở rộng §35 ObservableCollection §36 LINQ §37 (Multithreading) async - bất đồng bộ §38 Type §39 Attribute Annotation §40 DI Dependency Injection §41 (Multithreading) Parallel §42 Thư viện lớp §43 (Networking) Uri, Dns, Ping §44 (Networking) HttpClient §45 (Networking) HttpMessageHandler §46 (Networking) HttpListener §47 (Networking) Tcp TcpListenerr/TcpClient §48 (ADO.NET) SqlConnection §49 (ADO.NET) SqlCommand §50 (ADO.NET) DataAdapter §51 (EF Core) Tổng quan §52 (EF Core) Tạo Model §53 (EF Core) Fluent API §54 (EF Core) Query §55 (EF Core) Scaffold §56 (EF Core) Migration §57 (ASP.NET CORE) Hello World! §58 (ASP.NET CORE) Middleware §59 (ASP.NET CORE) Map - Request - Response §60 (ASP.NET CORE) IServiceCollection - MapWhen §61 (ASP.NET CORE) Session - ISession §62 (ASP.NET CORE) Configuration §63 (ASP.NET CORE) Gửi Mail §64 (ASP.NET CORE) SASS/SCSS §65 (ASP.NET CORE) LibMan §66 (ASP.NET RAZOR) Khởi tạo và Route §67 (ASP.NET RAZOR) Cú pháp Razor §68 (ASP.NET RAZOR) Layout trong ASP.NET Core §69 (ASP.NET RAZOR) Partial §70 (ASP.NET RAZOR) ViewComponent §71 (ASP.NET RAZOR) TagHelper §72 (ASP.NET RAZOR) HtmlHelper §73 (ASP.NET RAZOR) PageModel §74 (ASP.NET RAZOR) Model Binding §75 (ASP.NET RAZOR) HTML Form, Validation §76 (ASP.NET RAZOR) Upload File §77 (ASP.NET RAZOR) Entity Framework §78 (ASP.NET RAZOR) Paging §79 (ASP.NET RAZOR) Identity (1) - Register, Login, Logout §80 (ASP.NET RAZOR) Identity (2) Lockout, Reset Password §81 (ASP.NET RAZOR) Identity (3) Google Login §82 (ASP.NET RAZOR) Identity (4) Facebook Login §83 (ASP.NET RAZOR) Identity (5) profile, password, email ... §84 (ASP.NET RAZOR) Identity (6) Role §85 (ASP.NET RAZOR) Identity (7) Role-based Authorization §86 (ASP.NET RAZOR) Identity (8) RoleClaim §87 (ASP.NET RAZOR) Identity (9) Authorization Handler §88 (ASP.NET RAZOR) IAuthorizationService §89 (ASP.NET MVC) Controller - View §90 (ASP.NET MVC) Route §91 (ASP.NET MVC) EF, Identity §92 (ASP.NET MVC) Binding, Validation §93 (ASP.NET MVC) Xây dựng Website(1) §94 (ASP.NET MVC) Xây dựng Website(2) §95 (ASP.NET MVC) Xây dựng Website(3) §96 (ASP.NET MVC) Xây dựng Website(4) §97 (ASP.NET MVC) Giỏ hàng - Cart (5) §98 (ASP.NET MVC) elFinder (5) §99 (ASP.NET MVC) SB Admin (6) §100 (ASP.NET MVC) Kestrel, publish

Phần này tìm hiểu tạo ra một máy chủ HTTP đơn giản với lớp HttpListener. Thông thường để có đầy đủ các tính năng khi triển khai ứng dụng chúng ta có thể sử dụng dịch vụ HTTP hoàn chỉnh như IIS, Apache HTTPD, Nginx hay Kestrel. Tuy vậy, để nhanh chóng có thể tạo dịch vụ lắng nghe các yêu cầu HTTP gửi đến (Http Request Message) và trả về Response (Http Message Response) thích hợp thì có thể dùng đến HttpListener

Lớp HttpListener

Lớp HttpListener giúp tạo ra dịch vụ với giao thức HTTP, nó lắng nghe các yêu cầu HTTP Request gửi đến và trả về HTTP Respone. Dịch vụ HTTP hoạt động và tồn tại cùng với sự tồn tại của đối tượng HttpListener.

Một số phương thức thuộc tính của lớp HttpListener

Thành viên Diễn tả
IsSupported Phương thức tĩnh kiểu bool, cho biết máy có hỗ trợ HttpListener hay không
Prefixes Thuộc tính, nó chứa các chuỗi cấu trúc URI mà HttpListener làm việc. Ví dụ để nó làm việc trên cổng 8080, giao thức http:// thì chuỗi đó là http://*:8080/ và làm việc trên cổng 443 thì chuỗi là https://*/
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://*:8080/");
listener.Prefixes.Add("https://*/");
Start() Bắt đầu cho phép nhận các yêu cầu (HTTP Request) gửi đến.
Stop() Dừng dịch vụ
GetContextAsync() Chờ kết tạo một kết nối client gửi đến và thực hiện bất đồng bộ nhận thông tin gửi đến bởi client nếu có. Trả về Task với thuộc tính Result khi kết thúc là đối tượng kiểu HttpListenerContext chứa thông tin gửi đến (request) và thông tin sẽ trả về response, khi đối tượng này huỷ thì respone sẽ trả về cho clien truy cập.
HttpListenerContext   context  = await listener.GetContextAsync();
HttpListenerRequest   request  = context.Request; // chứa thông tin gửi đến
HttpListenerResponse  response = context.Response;// các nội dung trả về thiết lập vào respone

Code tạo máy chủ Http cơ bản như sau:

// Mảng chứa địa chỉ Http lắng nghe
// http =  giao thức http, * = ip bất kỳ, 8080 = cổng lắng nghe
string[] prefixes  = new string[] { "http://*:8080/" };

HttpListener listener = new HttpListener();

if (!HttpListener.IsSupported) throw new Exception ("Hệ thống hỗ trợ HttpListener.");

if (prefixes == null || prefixes.Length == 0) throw new ArgumentException ("prefixes");

foreach (string s in prefixes) {
    listener.Prefixes.Add (s);
}

Console.WriteLine ("Server start ...");

// Http bắt đầu lắng nghe truy vấn gửi đến
listener.Start();

// Vòng lặp chấp nhận và xử lý các client kết nối
do
{
    // Chấp nhận khi có cliet kết nối đế
    HttpListenerContext context = await listener.GetContextAsync();

    // ....
    // Xử lý context - đọc  thông tin request,  ghi thông tin response
    // ... ví dụ như sau:

    var response = context.Response;                                        // lấy HttpListenerResponse
    var outputstream = response.OutputStream;                               // lấy Stream lưu nội dung gửi cho client

    context.Response.Headers.Add("content-type", "text/html");              // thiết lập respone header
    byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Hello world!");     // dữ liệu content
    response.ContentLength64 = buffer.Length;
    await outputstream.WriteAsync(buffer,0,buffer.Length);                  // viết content ra stream
    outputstream.Close();                                                   // Đóng stream (gửi về cho cliet)

}
while (listener.IsListening);

Ví dụ tạo máy chủ HTTP đơn giản bằng HttpListener

Source Code

Sử dụng

static async Task Main(string[] args)
{
    var server = new MyHttpServer(new string[] {"http://*:8080/"});
    await server.StartAsync();
}

Truy cập thử với http://localhost:8080/requestinfo

Tham khảo mã nguồn WebListener (git) hoặc tải về ex035