1. Nói về lý do tạo project ASP.Net Core Empty
Mẫu Empty tạo ra một cấu trúc tối giản, không tự động sinh ra các tệp thừa (controllers, models, views). Nhằm để đảm bảo trong quá trình học, người xem có thể kiểm soát và hiểu rõ nguyên lý hoạt động của từng dòng mã khởi chạy.
2. Chu trình khởi chạy ứng dụng
Mã nguồn Program.cs thiết lập chu trình khởi chạy ứng dụng. Quá trình này chia làm 4 giai đoạn logic bắt buộc.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
WebApplication.CreateBuilder(args): Lệnh này khởi tạo đối tượng WebApplicationBuilder. Nhiệm vụ của nó là nạp các thiết lập cấu hình từ tệp appsettings.json hoặc biến môi trường, cấu hình dịch vụ ghi nhật ký (logging) và mở bộ chứa tiêm phụ thuộc (Dependency Injection - DI). Bước này tồn tại để gom toàn bộ tài nguyên trước khi ứng dụng thực sự hình thành.
builder.Build(): Lệnh này biên dịch các thành phần trung gian (middleware) và khóa lại toàn bộ cấu hình. Phương thức này sinh ra đối tượng WebApplication (gán biến app) chịu trách nhiệm xử lý yêu cầu HTTP.
app.MapGet(): Lệnh này thiết lập định tuyến HTTP GET. Nó ánh xạ yêu cầu từ đường dẫn gốc (/) tới một biểu thức lambda, trả về chuỗi văn bản "Hello World!".
app.Run(): Lệnh này kích hoạt máy chủ web để ứng dụng bắt đầu lắng nghe yêu cầu HTTP từ mạng. Đây là một lệnh chặn luồng (blocking call), giữ cho ứng dụng hoạt động liên tục cho đến khi bị tắt thủ công (bằng Ctrl+C).
3. Nhật ký hệ thống (Logs) trong quá trình khởi chạy
Khi lệnh app.Run() kích hoạt máy chủ web, hệ thống xuất ra các thông báo nhật ký để cung cấp thông tin trạng thái hoạt động.
- Now listening on: Xác nhận địa chỉ URL và cổng (port) mà máy chủ đang lắng nghe yêu cầu (ví dụ:
http://localhost:5117).- Application started: Xác nhận ứng dụng đã khởi động thành công và cung cấp hướng dẫn đóng tiến trình bằng cách nhấn Ctrl+C.
- Hosting environment: Xác định môi trường thực thi hiện tại (Development, Staging hoặc Production). Biến môi trường này định hình cách hệ thống xử lý lỗi và nạp cấu hình.
- Content root path: Chỉ định đường dẫn gốc trên ổ cứng, nơi lưu trữ tệp tin ứng dụng và dữ liệu tĩnh.

4. Kiến trúc máy chủ web
Máy chủ được khởi động bởi lệnh app.Run() mặc định là Kestrel.
- Máy chủ tiêu thụ rất ít tài nguyên hệ thống khi vận hành vì Kestrel được thiết kế tối giản, không ôm đồm các tính năng mạng phức tạp như quản lý phiên hay bộ nhớ đệm. Kestrel sử dụng kiến trúc luồng dữ liệu bất đồng bộ, cho phép nó tiếp nhận và phản hồi hàng nghìn yêu cầu HTTP mỗi giây với độ trễ cực thấp.
- Nhưng thiếu các tính năng kiểm soát mạng. Vì vậy, trong môi trường thực tế (production), hệ thống luôn đặt các proxy ngược (Nginx, Apache, IIS) đứng trước. Máy chủ proxy ngược hứng toàn bộ lưu lượng mạng để thực hiện cân bằng tải (chia đều yêu cầu cho nhiều máy chủ), mã hóa SSL/TLS, lưu trữ bộ nhớ đệm (caching) và lọc dữ liệu bảo mật, sau đó mới chuyển tiếp yêu cầu sạch vào Kestrel.
5. Tùy biến môi trường khởi chạy cục bộ (launchSettings.json)

* Khối cấu hình iisSettings(phiên bản giả lập thu nhỏ của máy chủ IIS trên Windows):
windowsAuthentication / anonymousAuthentication: Bật hoặc tắt tính năng xác thực danh tính người dùng qua Windows.
iisExpress: Chứa địa chỉ applicationUrl dành riêng cho IIS Express và thiết lập sslPort. sslPort được đặt là 0, nghĩa là kết nối bảo mật HTTPS đang bị tắt.
* Khối cấu hình profiles (Hồ sơ khởi chạy)
Mặc định khi tạo dự án, hệ thống sinh ra hai hồ sơ: một hồ sơ mang tên dự án (dùng Kestrel) và một hồ sơ tên là IIS Express. Tên của hồ sơ (ví dụ: "MyFirstProject") hoàn toàn có thể đổi thành một tên khác có ý nghĩa hơn, chẳng hạn như "MyFirstProject.Kestrel". Bất kỳ thay đổi tên nào trong tệp này, ngay sau khi nhấn lưu, sẽ tự động đồng bộ và hiển thị trên menu thả xuống ở thanh công cụ (toolbar) của Visual Studio.
Việc chọn hồ sơ trên thanh công cụ sẽ quyết định máy chủ nào được khởi chạy.

commandName: xác định máy chủ. Nếu giá trị là "Project", hệ thống hiểu là chạy lệnh dotnet run (kích hoạt Kestrel). Nếu giá trị là "IISExpress", hệ thống khởi động máy chủ giả lập IIS.
dotnetRunMessages: Khi đặt là true, nếu có các lệnh .NET CLI được thực thi trong quá trình máy chủ chạy, thông báo chi tiết của chúng sẽ được hiển thị trực tiếp lên cửa sổ terminal của Kestrel.
launchBrowser: Khi đặt là true, trình duyệt mặc định của hệ điều hành (như Chrome) sẽ tự động mở lên ngay sau khi máy chủ khởi động thành công.
applicationUrl: Xác định đường dẫn URL đầy đủ.
environmentVariables: Nơi khai báo các biến môi trường toàn cục có thể được gọi ra ở bất kỳ đâu trong mã nguồn C#.