ASP.NET Core là công nghệ phát triển ứng dụng web dựa trên hai nền tảng .NET Framework và   .NET Core của Microsoft (Phân biệt .NET Core và .NET Framework có thể tham khảo tại https://ngocminhtran.com/2020/02/09/net-core-ung-dung-console-dau-tien-va-cach-debug/ ). MVC (Model View Controller) là mô hình phổ biến dùng để tách bạch dữ liệu, quy tắc nghiệp vụ và giao diện người dùng trong các dự án phát triển web. Công nghệ ASP.NET dựa trên hai nền tảng hoàn toàn khác nhau: ASP.NET (phiên bản 4.X trở về trước) dựa trên .NET Framework và ASP.NET Core dựa trên .NET Core. Bài viết này là bài viết đầu tiên trong loạt bài viết giới thiệu về ASP.NET Core MVC hướng tới xây dựng một ứng dụng web sử dụng môi trường Visual Studio 2019 Community.

ASP.NET Core là phiên bản tiến hóa mới nhất của công nghệ ASP.NET, kế thừa những tính năng nổi trội từ ASP.NET cũ nhưng ASP.NET Core là nền tảng hoàn toàn mới, khác biệt so với ASP.NET trước đây. Để hiểu tại sao Microsoft lại quyết định xây dựng một nền tảng công nghệ hoàn toàn mới thay vì phát triển ASP.NET hiện có thì chúng ta cần hiểu một số ưu điểm và hạn chế của ASP.NET.

ASP.NET xuất hiện lần đầu vào năm 2002 như là một phần của .NET Framework 1.0. Ứng dụng ASP.NET lúc này là ASP.NET Web Forms cho phép tạo các ứng dụng dựa trên giao diện đồ họa và mô hình hướng sự kiện. Theo thời gian, với việc các ứng dụng ASP.NET Web Forms trở nên cồng kềnh, khó bảo trì nên đến năm 2009, Microsoft cho ra đời phiên bản ASP.NET MVC nhằm tạo các ứng dụng web dựa trên mô hình MVC. Dù có nhiều ưu điểm nổi bật hơn ASP.NET Web Forms nhưng cả hai cùng dựa vào một nền tảng với tập tin trọng tâm System.Web.dll. Sự phụ thuộc này kế thừa một số ưu điểm của .NET Framework như tính tin cậy cao và nhiều tính năng thuận tiện cho sự phát triển các ứng dụng web hiện đại trên nền tảng Windows, đồng thời cũng mang lại một số hạn chế. Sự hạn chế đầu tiên là sự thay đổi chậm chạp về nội dung trong tập tin System.Web.dll ảnh hưởng lớn đến khả năng mở rộng của ASP.NET, bên cạnh đó, các ứng dụng web hiện đại đòi hỏi thực thi đa nền (cross platform) tức là không chỉ thực thi trên Windows mà còn trên Linux hay MacOS.

ASP.NET Core là gì?

.NET Core là một nền tảng mã nguồn mở được Microsoft giới thiệu lần đầu tiên năm 2014 và trở thành một trong những nền tảng phổ biến nhất hiện nay (có thể tham khảo thêm tại https://ngocminhtran.com/2020/02/09/net-core-ung-dung-console-dau-tien-va-cach-debug/ ). Với .NET Core, Microsoft có thể xây dựng một nền tảng công nghệ web thỏa mãn 4 mục tiêu:

  • Thực thi và phát triển đa nền (Linux, Windows, MacOS)
  • Kiến trúc mô đun để dễ dàng bảo trì
  • Phát triển như phần mềm mã nguồn mở
  • Tương thích với khuynh hướng phát triển web hiện tại như ứng dụng hướng client hay môi trường đám mây

Và ASP.NET Core – tức công nghệ ASP.NET kế thừa nền tảng cũ .NET Framework và phát triển thêm những tính năng mới trên nền tảng .NET Core – ra đời.

Hình ảnh mô tả mối quan hệ giữa các nền tảng công nghệ web của Microsoft

.NET Core là nền tảng hoàn toàn mới nhưng chia sẻ nhiều thư viện (API) giống nền tảng .NET Framework chỉ có điều các thư viện trong .NET Core có kích thước nhỏ hơn với mục đích cung cấp một mô hình lập trình và thực thi ứng dụng đơn giản hơn.

Khi nào lựa chọn ASP.NET Core

Khi quyết định chọn ASP.NET Core, cần xác định hai câu hỏi quan trọng:

  • Đây là lần đầu tiên bạn phát triển ứng dụng trên nền tảng .NET?
  • Bạn muốn tạo một ứng dụng mới hay chuyển đổi ứng dụng đã có?

Nếu bạn là trường hợp đầu tiên thì ASP.NET Core là lựa chọn hoàn hảo và vì những ưu điểm của ASP.NET Core nên nó cũng là lựa chọn hoàn hảo nếu bạn đang cân nhắc xây dựng một ứng dụng web mới (ý đầu tiên câu hỏi thứ 2). Nếu bạn muốn chuyển đổi một ứng dụng sẵn có sang nền tảng ASP.NET Core thì câu chuyện lại phức tạp hơn nhiều. Các ứng dụng dùng ASP.NET Web Forms, SignalR hay WCF thì việc chuyển đổi là không thể, nếu các ứng dụng dùng MVC hay Web API thì việc chuyển đổi đòi hỏi cập nhật thêm nhiều thông tin.

Tóm lại, nếu bạn là người mới bắt đầu phát triển một ứng dụng web dùng ASP.NET hay đang cân nhắc xây dựng một ứng dụng web hoàn toàn mới thì ASP.NET Core là lựa chọn hoàn hảo. Nếu ứng dụng sẵn có được xây dựng từ ASP.NET MVC, Web API và Razor thì việc chuyển đổi sang ASP.NET Core là khả thi.

HTTP là giao thức cốt lõi cho việc thực thi các ứng dụng web. Do đó, trước khi tìm hiểu về cách làm việc của ASP.NET Core, chúng ta cần tìm hiểu lại cách thức hoạt động của giao thức này.

HTTP Request và HTTP Response

Khi người dùng thực hiện một yêu cầu bằng cách nhập một đường dẫn hay URL vào thanh địa chỉ của một trình duyệt web thì yêu cầu này sẽ được gửi đến server (cũng có thể được hiểu là web server) thông qua chức năng HTTP request của giao thức HTTP. Tại server, yêu cầu sẽ được xử lý và server sẽ phát sinh một nội dung HTML để gửi trở lại trình duyệt web thông qua chức năng HTTP response của giao thức HTTP.

Quá trình thực thi được phản ánh thông qua 4 bước như hình dưới đây:

Cách ASP.NET Core làm việc

Người dùng từ trình duyệt web muốn gửi một yêu cầu đến ứng dụng ASP.NET Core cũng phải thông qua giao thức HTTP. Nhưng thay vì yêu cầu được gửi trực tiếp đến server (hay web server), nó phải thông qua một reverse-proxy server. Hiểu một cách đơn giản, một reverse-proxy server là một phần mềm có trách nhiệm nhận và chuyển tiếp yêu cầu từ người dùng đến server (hay web server). Các reverse-proxy server được công khai trên internet nhưng các web server thì chỉ có reverse-proxy server biết. Điều này làm tăng tính bảo mật và khả năng thực thi của các web server. Phần mềm reverse-proxy server trên Windows là IIS, trên Linux hay MacOS có thể là NGHINX hay Apache. Các bước thực thi được mô tả như hình sau đây:

Ở đây, ASP.NET Core web server là Kestrel, một web server thực thi đa nền (cross-platform). Tham khảo thêm về Kestrel tại https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1

Tạo và thực thi ứng dụng ASP.NET Core

Tạo ứng dụng ASP.NET Core MVC trong môi trường Visual Studio 2019 Community có nhiều cách và một trong những cách nhanh nhất là dùng các template có sẵn. Giả sử chúng ta muốn tạo một ứng dụng ASP.NET Core MVC quản lý sách tên MVCBooks, chúng ta thực hiện các bước sau:

 Cấu trúc một dự án ASP.NET Core MVC

Từ cửa sổ Solution Explorer, chúng ta có thể lướt qua cấu trúc tổng thể của một dự án ASP.NET Core MVC với một số thành phần sau:

  • Vị trí cao nhất trong cửa sổ Solution Explorer là thư mục gốc của dự án được lồng trong một thư mục solution. Visual Studio dùng khái niệm solution để làm việc với nhiều dự án, trong trường hợp này chỉ có một dự án. Tại thư mục này chúng ta sẽ tìm thấy một tập tin solution (có phần mở rộng .sln).
  • Kế tiếp thư mục gốc dự án là tập tin quan trọng nhất của dự án, tập tin MVCBooks.csproj.
  • Vì chúng ta đang dùng mô hình MVC nên chú ý tiếp theo của chúng ta sẽ là các thư mục Controllers, Models Views chứa các tập tin dùng để xây dựng dự án.
  • Thư mục Properties chứa tập tin launchSettings.json kiểm soát cách Visual Studio sẽ chạy và debug ứng dụng.
  • Thư mục wwwroot là thư mục đặc biệt cho phép các trình duyệt web có thể truy cập trực tiếp đến nội dung bên trong nó như các tập tin CSS, JS, hình ảnh hay các tập tin HTML. Các trình duyệt sẽ không thể truy cập được các tập tin này nếu chúng ở bên thư mục wwwroot.
  • Properties wwwroot được xem như là hai thư mục đặc biệt, được đặt phía trên cửa sổ Solution Explorer, gần mục dự án và không tuân theo thứ tự các chữ cái. Phía trên hai thư mục này có hai mục đặc biệt hơn gọi là Dependencies Connected Servives chứa các thành phần phụ thuộc đến dự án như các gói NuGet, các dịch vụ từ xa, các thành phần hướng client.
  • Tập tin appsettings.json cung cấp thông tin cấu hình ứng dụng tại thời điểm thực thi hay thời điểm biên dịch.
  • Cuối cùng là hai tập tin Program.csStartup.cs kiểm soát cấu hình và quá trình khởi động của ứng dụng tại thời điểm thực thi. Chúng ta sẽ tìm hiểu kĩ hơn nội dung hai tập tin này.

Tập tin dự án csproj

Là tập tin quan trọng nhất của ứng dụng .NET nhưng trong ASP.NET Core, nội dung tập tin này được lược giản để dễ đọc, dễ chỉnh sửa hơn. Ví dụ nội dung MVCBooks.csproj:

<Project Sdk="Microsoft.NET.Sdk.Web">
 	 <PropertyGroup>
   		 <TargetFramework>netcoreapp3.1</TargetFramework>
  	</PropertyGroup>
</Project>

Thuộc tính Sdk của phần tử Project xác định kiểu dự án đang xây dựng (trong trường hợp này là Web). Phần tử TargetFramework xác định framework ứng dụng đang chạy, trong trường hợp này là .NET Core 3.1.

Tập tin Program.cs

Tương tự các ứng dụng Console, dự án ASP.NET Core cũng chứa lớp Program với hàm Main nhưng mục đích của hàm này là dùng để xây dựng và thực thi một đối tượng IWebHost. IWebHost là cốt lõi ứng dụng ASP.NET Core chứa cấu hình ứng dụng và Kestrel server để lắng nghe các yêu cầu và hồi đáp đến người dùng. Nó dùng một WebHostBuilder, được tạo bằng lời gọi CreateDefaultBuilder để định nghĩa cách IWebHost được cấu hình trước khi một đối tượng IWebHost được tạo bằng lời gọi Build(). Nội dung lớp Program từ MVCBooks:

public class Program
 {
    public static void Main(string[] args)
     {
        CreateHostBuilder(args).Build().Run();
     }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
              {
                    webBuilder.UseStartup<Startup>();
              });
  }

Tập tin Startup.cs

Tập tin này chứa lớp Startup chứa thông tin cấu hình ứng dụng dựa trên hai khía cạnh:

  • Tất cả các lớp được dùng trong ứng dụng phải được đăng ký để chúng có thể được sử dụng một cách chính xác tại thời gian thực thi.
  • Cách thức ứng dụng xử lý và hồi đáp các yêu cầu từ người dùng.

Lớp Startup từ MVCBooks:

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to 
         // add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
        }

        // This method gets called by the runtime. Use this method to 
        // configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, 
                   IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to 
               // change this for production scenarios, see 
               // https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: " 
                   {controller=Home}/{action=Index}/{id?}");
            });
        }
    }

Xử lý yêu cầu thông qua mô hình MVC

Cách thức xử lý và hồi đáp yêu cầu người dùng đã được trình bày một cách tổng quát ở trên nhưng nếu muốn xem chi tiết hơn về cách mô hình MVC xử lý thì thông qua hình ảnh sau đây:

Khi một yêu cầu được tạo đến trang Home/Index, MVC HomeController sẽ xử lý yêu cầu bằng cách thực thi phần Index action. Kết quả sẽ tạo một đối tượng ViewResult chứa dữ liệu được dùng để phát sinh nội dung HTML. Việc phát sinh nội dung HTML do trình thực thi Razor đảm nhiệm và trình thực thi này sẽ xác định các Razor template phù hợp. Các Razor template được lưu trữ trong các tập tin có phần mở rộng là cshtml được chứa trong thư mục View:

Các Razor template chứa mã HTML, C# hay mã HTML phát sinh từ mã C#, tập tin _Layout.cshtml tạo ra các thành phần chung nhất của một trang web như header hay footer.

Như vậy, thông qua bài viết đầu tiên này, chúng ta đã có một cái nhìn tổng quan và cách tạo một ứng dụng ASP.NET Core MVC. Bài viết cũng trình bày lý do chọn ASP.NET Core MVC như là một lựa chọn tối ưu cho những nhà phát triển Web vừa mới làm quen với môi trường .NET hay đang muốn xây dựng một ứng dụng ASP.NET hoàn toàn mới.