Tạo project ASP.NET Core đầu tiên

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách tạo một project ASP.NET Core đầu tiên bằng Visual Studio.

Bạn có thể truy cập Hướng dẫn lập trình ASP.NET Core để không bỏ lỡ bất kỳ bài viết nào của chúng tôi.

Tạo project ASP.NET Core

Mở Visual Studio và nhấp vào Create a new project, như hình bên dưới.

Tạo project ASP.NET Core trong Visual Studio 2019

Hộp thoại "Create a new project" bao gồm nhiều mẫu ứng dụng .NET Core khác nhau.

Mỗi mẫu sẽ tạo các tệp và thư mục dự án được định nghĩa trước tùy thuộc vào loại ứng dụng.

Ở đây chúng ta sẽ tạo một ứng dụng web đơn giản, vì vậy hãy chọn mẫu ASP.NET Core Web Application và nhấp vào Next, như hình bên dưới.

Tạo project ASP.NET Core trong Visual Studio 2019

Tiếp theo, chúng ta sẽ nhập tên dự án, chọn vị trí thích hợp để lưu dự án và nhập tên giải pháp cho ứng dụng ASP.NET Core. Trong ví dụ này, chúng ta sẽ đặt tên dự án là "MyFirstCoreWebApp" và nhấp vào nút Create , như hình bên dưới.

Tạo project ASP.NET Core trong Visual Studio 2019

Tiếp theo, chọn mẫu thích hợp cho ứng dụng ASP.NET Core như Empty, API, Web Application, MVC, v.v ... Ở đây, chúng ta muốn tạo một ứng dụng web, vì vậy hãy chọn mẫu Web Application.

Chúng ta không muốn HTTPS tại thời điểm này, vì vậy hãy bỏ chọn hộp kiểm Configure for HTTPS, như hình bên dưới. Ngoài ra, hãy chắc chắn rằng bạn đã chọn phiên bản .NET Core và ASP.NET Core thích hợp. Nhấp vào nút Create để tạo dự án.

Tạo project ASP.NET Core trong Visual Studio 2019

Điều này sẽ tạo ra một dự án web ASP.NET Core mới trong Visual Studio, như hình bên dưới. Đợi một lúc cho đến khi Visual Studio khôi phục các gói trong dự án.

Quá trình khôi phục có nghĩa là Visual Studio sẽ tự động thêm, cập nhật hoặc xóa các phụ thuộc được cấu hình như các gói NuGet trong dự án.

Tạo project ASP.NET Core trong Visual Studio 2019

Chúng ta sẽ tìm hiểu cấu trúc dự án trong phần tiếp theo của hướng dẫn này. Để chạy ứng dụng web này, nhấn F5 (chế độ Debug) hoặc nhấn Ctrl + F5. Điều này sẽ mở trình duyệt và hiển thị kết quả sau đây.

Chạy project ASP.NET Core

Đầu ra ở trên đến từ file Index.cshtml trong thư mục Pages .

Bạn cũng có thể thấy biểu tượng IIS Express trên khay hệ thống. Nhấp chuột phải vào nó. Bạn có thể thấy project ASP.NET Core của bạn hiện đang chạy trong này.

IIS Express trên khay hệ thống

Cấu trúc project ASP.NET Core

Ở phần này, bạn sẽ tìm hiểu về cấu trúc của project và tầm quan trọng của từng thành phần trong project ASP.NET Core.

Dưới đây là cấu trúc dự án mặc định khi bạn tạo một ứng dụng ASP.NET Core rỗng (empty) trong Visual Studio.

Cấu trúc project ASP.NET Core

Tab Solution Explorer hiển thị các project của giải pháp. Chúng ta có thể thay đổi nó thành chế độ xem thư mục bằng cách nhấp vào biểu tượng Solution and Folders và chọn tùy chọn chế độ xem Folder View. Điều này sẽ hiển thị tất cả các thư mục và file của project như dưới đây.

Lưu ý: Các file và thư mục của project ASP.NET Core được đồng bộ hóa với các file và thư mục vật lý. Nếu bạn thêm một tập tin hoặc thư mục mới trong thư mục dự án thì nó sẽ tự động được thêm vào trong Solution Explorer. Bạn không cần phải thêm nó vào dự án một cách thủ công bằng cách nhấp chuột phải vào project.

File .csproj

ASP.NET Core 1.0 không tạo tệp .csproj, thay vào đó, nó sử dụng các tệp .xproj và project.json để quản lý dự án. Điều này đã thay đổi trong ASP.NET Core 2.0.

Visual Studio hiện sử dụng tệp .csproj để quản lý dự án. Chúng ta có thể chỉnh sửa cài đặt .csproj bằng cách nhấp chuột phải vào dự án và chọn Edit <project-name>.csproj như hình bên dưới.

Chỉnh sửa file .csproj

File .csproj của project trông sẽ như hình dưới đây.

Nội dung file .csproj

File .csproj có các cài đặt liên quan đến .NET Framework, thư mục dự án, tham chiếu gói NuGet, v.v.

Dependencies

Các phụ thuộc (Dependencies) trong project ASP.NET Core chứa tất cả các gói NuGet phía máy chủ được cài đặt, như hình bên dưới.

Quản lý phụ thuộc trong project ASP.NET Core

Nhấp chuột phải vào "Dependencies" và sau đó nhấp vào "Manage NuGet Packages.." để xem các gói NuGet đã cài đặt, như hình bên dưới.

Quản lý phụ thuộc trong project ASP.NET Core

Như bạn có thể thấy, nó đã cài đặt ba gói, gói Microsoft.AspNetCore.App dành cho ứng dụng web ASP.NET, gói Microsoft.AspNetCore.Razor.Design dành cho Razor engine và gói Microsoft.NETCore.App dành cho .NET Core API.

Bạn có thể cài đặt tất cả các phụ thuộc phía máy chủ cần thiết khác dưới dạng các gói NuGet từ cửa sổ Manage NuGet Packages hoặc sử dụng trình quản lý dòng lệnh Package Manager Console.

Properties

Properties có file launchSettings.json chứa các cấu hình về môi trường chạy ứng dụng. Sau đây là tệp launchSinstall.json mặc định.

File launchSinstall.json trong project ASP.NET Core

Chúng ta cũng có thể chỉnh sửa cài đặt từ tab Debug trong giao diện quản lý thuộc tính của dự án. Nhấp chuột phải vào project -> chọn Properties -> nhấp vào tab Debug.

Cấu hình chế độ debug cho project ASP.NET Core

Trong tab Debug, chọn một cấu hình mà bạn muốn chỉnh sửa như được hiển thị ở trên. Bạn có thể thay đổi các biến môi trường, url, v.v.

Thư mục wwwroot trong ASP.NET Core

Theo mặc định, thư mục wwwroot trong project ASP.NET Core được coi là thư mục gốc của web. Các file tĩnh có thể được lưu trữ trong bất kỳ thư mục nào trong thư mục gốc của web và được truy cập bằng một đường dẫn tương đối đến thư mục gốc đó.

Trong một ứng dụng ASP.NET tiêu chuẩn, các tệp tĩnh có thể được đặt ở thư mục gốc của ứng dụng hoặc bất kỳ thư mục nào khác bên trong thư mục gốc ứng dụng.

Điều này đã được thay đổi trong ASP.NET Core. Bây giờ, chỉ những tệp trong thư mục gốc - thư mục wwwroot mới có thể truy cập qua yêu cầu http. Tất cả các tệp khác nằm ngoài thư mục này bị chặn và không thể truy cập theo mặc định.

Nói chung, nên tạo các thư mục riêng cho các loại tệp tĩnh khác nhau như JavaScript, CSS, Image, Library, v.v. trong thư mục wwwroot như dưới đây.

Thư mục wwwroot trong project ASP.NET Core

Bạn có thể truy cập các file tĩnh với URL cơ sở và tên tệp. Ví dụ: chúng ta có thể truy cập file app.css ở trên trong thư mục css bằng http://localhost:<port>/css/app.css.

Hãy nhớ rằng, bạn cần bổ sung middleware để phục vụ các file tĩnh trong phương thức Configure của file Startup.cs sẽ được trình bày ở phần dưới của hướng dẫn này.

Đổi tên thư mục wwwroot

Bạn có thể đổi tên thư mục wwwroot thành bất kỳ tên nào khác theo nhu cầu của bạn và đặt nó làm thư mục gốc web trong file program.cs.

Ví dụ dưới đây minh họa đổi tên thư mục wwwroot thành thư mục Content. Bây giờ, hãy gọi phương thức UseWebRoot() để cấu hình thư mục Content làm thư mục gốc của web trong phương thức Main() của lớp Program như dưới đây.

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseWebRoot("Content")
            .UseIISIntegration()
            .UseStartup<MyStartup>()
            .Build();

        host.Run();
    }
}

Do đó, bạn hoàn toàn có thể đổi tên thư mục gốc web mặc định wwwroot theo nhu cầu của bạn.

File Program.cs trong ASP.NET Core

Ứng dụng web ASP.NET Core thực sự là một project console, nó bắt đầu thực thi từ điểm public static void Main() trong lớp Program nơi chúng ta có thể tạo một máy chủ cho ứng dụng web.

Thiết lập máy chủ trong ASP.NET Core

Sau đây là một file Program.cs điển hình trong project ASP.NET Core.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace MyFirstCoreApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

Như bạn có thể thấy ở trên, phương thức Main() gọi thức phương thức BuildWebHost() để tạo máy chủ web với các mặc định được cấu hình sẵn. Ở ví dụ trên, phương thức BuildWebHost sử dụng ký pháp tốc ký và nó tương đương với cách viết rõ ràng như dưới đây.

public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) 
{
    return WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();
}

WebHost là một lớp tĩnh có thể được sử dụng để tạo một thể hiện của interface IWebHostIWebHostBuilder với các mặc định được cấu hình sẵn.

Phương thức CreateDefaultBuilder() tạo ra một thể hiện mới của WebHostBuilder với giá trị mặc định cấu hình sẵn.

Trong nội bộ, nó cấu hình web server Kestrel, IISIntegration và các cấu hình khác.

Sau đây là phương thức CreateDefaultBuilder() từ mã nguồn trên GitHub .

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
    var builder = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

            if (env.IsDevelopment())
            {
                var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                if (appAssembly != null)
                {
                    config.AddUserSecrets(appAssembly, optional: true);
                }
            }

            config.AddEnvironmentVariables();

            if (args != null)
            {
                config.AddCommandLine(args);
            }
        })
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
        })
        .UseIISIntegration()
        .UseDefaultServiceProvider((context, options) =>
        {
            options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
        });

    return builder;
}

Như bạn có thể thấy ở trên, phương thức CreateDefaultBuilder tạo một thể hiện của WebHostBuilder và thiết lập máy chủ web Kestrel, thư mục gốc cho nội dung, IISIntegration.

Nó cũng gọi ConfigureAppConfiguration() để tải cấu hình từ file appsettings.json, các biến môi trường và các dữ liệu bí mật của người dùng. Phương thức ConfigureLogging() thiết lập ghi log.

File Startup.cs trong ASP.NET Core

Ở đây, chúng ta sẽ có một cái nhìn tổng quan về lớp Startup trong file Startup.cs.

Ứng dụng ASP.NET Core phải có lớp Startup. Nó giống như Global.asax trong ứng dụng ASP.NET truyền thống. Như tên cho thấy, nó được thực thi đầu tiên khi ứng dụng khởi chạy.

Lớp Startup có thể được cấu hình bằng phương thức UseStartup<T>() tại thời điểm cấu hình máy chủ trong phương thức Main() của lớp Program như dưới đây.

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

    public static IWebHost BuildWebHost(string[] args)
    {
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
    }
}

Tên "Startup" là theo quy ước của ASP.NET Core. Tuy nhiên, chúng ta có thể đặt bất kỳ tên nào cho lớp Startup, chỉ cần chỉ định nó là tham số chung trong phương thức UseStartup<T>(). Ví dụ: để đặt tên lớp Startup là MyStartup, chỉ định nó là .UseStartup<MyStartup>().

Mở lớp Startup trong Visual Studio bằng cách nhấp vào Startup.cs trong Solution Explorer. Sau đây là lớp Startup mặc định trong ASP.NET Core.

public void ConfigureServices(IServiceCollection services)
{
	// some code
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
	// some code
	
	app.UseMvc(routes =>
	{
		routes.MapRoute(
			name: "default",
			template: "{controller=Home}/{action=Index}");
	});
}

Như bạn có thể thấy, lớp Startup bao gồm hai phương thức public là: ConfigureServiceConfigure .

Phương thức ConfigureService

Mẫu Dependency Injection được sử dụng rất nhiều trong kiến ​​trúc ASP.NET Core. Nó gồm IoC Container tích hợp để cung cấp các đối tượng phụ thuộc bằng cách sử dụng các phương thức khởi tạo.

Phương thức ConfigureService là nơi bạn có thể đăng ký các lớp phụ thuộc của mình với IoC Container tích hợp. Sau khi đăng ký lớp phụ thuộc, nó có thể được sử dụng ở bất cứ đâu trong ứng dụng. Bạn chỉ cần đưa nó vào tham số của phương thức khởi tạo của một lớp nơi bạn muốn sử dụng nó. IoC Container sẽ tự động tạo thể hiện cho nó.

ASP.NET Core gọi lớp phụ thuộc là một dịch vụ. Vì vậy, bất cứ khi nào bạn đọc từ "dịch vụ" thì hãy hiểu nó là một lớp sẽ được sử dụng trong một số lớp khác.

Phương thức ConfigureService bao gồm tham số IServiceCollection để đăng ký dịch vụ vào IoC Container. Chúng ta sẽ tìm hiểu thêm về nó trong chương tiếp theo.

Phương thức Configure

Phương thức Configure là nơi bạn có thể cấu hình đường ống dẫn yêu cầu cho ứng dụng của mình bằng cách sử dụng đối tượng IApplicationBuilder được cung cấp bởi IoC Container tích hợp.

ASP.NET Core đã giới thiệu các thành phần middleware để định nghĩa một đường ống dẫn yêu cầu, sẽ được thực hiện trên mỗi yêu cầu. Bạn chỉ thêm những thành phần middleware được yêu cầu bởi ứng dụng của bạn, điều này làm tăng hiệu suất của ứng dụng của bạn.

Sau đây là một phương thức Configure  mặc định.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

Như bạn có thể thấy, phương thức Configure bao gồm hai tham số IApplicationBuilder, IHostingEnvironment. Các dịch vụ này là các dịch vụ khung được đưa vào bởi IoC Container tích hợp.

Trong lúc thực thi, phương thức ConfigureService được gọi trước phương thức Configure. Điều này là để bạn có thể đăng ký dịch vụ tùy chỉnh của mình với IoC Container mà bạn có thể sử dụng trong phương thức Configure.



Bài viết liên quan:

View Layout, View Start, View Imports là gì? Lợi ích và các sử dụng View Layout, View Start, View Imports trong ASP.NET Core.

Tất tần tật về View, Razor View, Layout View, View Start, View Import, Tag Helpers trong ASP.NET Core MVC.

ActionResult trong ASP.NET Core là gì? Có những loại ActionResult nào? Làm sao để sử dụng ActionResult trong ASP.NET Core.