PRN222DễKỳ 7Chuyên ngành Cập nhật 07/09/2026

Advanced Cross-Platform Application Programming With .NET - Lập trình ứng dụng đa nền tảng nâng cao với .NET

PRN222 - Lập trình ứng dụng đa nền tảng nâng cao với .NET dạy cách dựng ứng dụng web chạy trên nhiều nền tảng bằng C# 12 và .NET 8 với ASP.NET Core. Môn đi từ chỗ hai tiến trình nói chuyện được với nhau, qua cách làm cho một máy chủ phục vụ nhiều người cùng lúc mà không đứng hình, tới các mô hình dựng giao diện và các dịch vụ chạy ngầm phía sau. Lớp dưới cùng là lập trình mạng trong .NET với địa chỉ IP, hostname, DNS, URI, các giao thức TCP và UDP, TcpListener cùng AcceptSocketAsync, TcpClient, Socket, lớp Stream, HttpClient và GetAsync. Lớp kế là lập trình bất đồng bộ và song song: async/await, Task, Task.Wait, Task.WhenAll, không gian tên System.Threading.Tasks, Parallel.ForEach, Task Parallel Library, PLINQ với AsParallel, cùng ranh giới giữa tác vụ I/O-bound và tác vụ CPU-bound. Phần kiến trúc dựng Dependency Injection và Inversion of Control trên nền nguyên lý SOLID, với AddScoped, AddTransient, AddSingleton và các vòng đời service, constructor injection, property injection, IServiceProvider, Dependency Inversion và Open Closed. Trên nền đó là ba lối dựng giao diện web. ASP.NET Core MVC tách controller, action, IActionResult, ViewResult, HttpPost, Bind, Compare, directive @model, cú pháp Razor, ViewData và ViewBag, PartialView, thư mục wwwroot, model binding và model validation qua ModelState. Razor Pages gộp trang với mã xử lý: file .cshtml, thư mục Pages, lớp PageModel, handler OnGet và OnPost, AddRazorPages, BindProperty, _Layout.cshtml, TempData, Session, Cookies, tiêm phụ thuộc vào PageModel và kiểm tra dữ liệu phía client bằng jQuery Unobtrusive Validation. Blazor đưa C# xuống trình duyệt theo ý niệm C# Everywhere, với Blazor Server, Blazor WebAssembly, hai chế độ render, component, App.razor, directive @page, @bind, @inject, khối @code và thuộc tính Parameter. Hai mảng cuối lo phần chạy ngầm: giao tiếp thời gian thực bằng SignalR với lớp Hub, IHubContext, Clients, Groups.AddToGroupAsync, Hub filters, MessagePack, tự động kết nối lại, AddSignalR, Context và User; cùng Worker Service với BackgroundService, IHostedService, Microsoft.Extensions.Hosting, ExecuteAsync, StartAsync, StopAsync, CancellationToken, cấu hình trong appsettings.json và xử lý hàng đợi. Dữ liệu đi xuyên suốt các lớp đó qua Entity Framework Core và DbContext. Học xong, người học dựng được một ứng dụng .NET nhiều tầng, chọn đúng mô hình giao diện cho từng bài toán và xử lý được phần việc chạy nền lẫn phần đẩy dữ liệu tức thời.

175Câu hỏi
4Bộ đề
8Chủ đề
5,01 đánh giá

Câu hỏi của môn

164/175 câuCòn 11
145Where is the Worker Service configured in a .NET Core application?4 lựa chọnDễ100% trả lời đúng
AProgram.cs
BApp.cs
Cappsettings.json
DlaunchSettings.json
Lời giải
Trong một ứng dụng .NET Core, Worker Service được cấu hình ở đâu?
Mở trang câu hỏi này →
146Which namespace contains the BackgroundService class?4 lựa chọnTrung bình60% trả lời đúng
ASystem.Threading
BMicrosoft.Extensions.Hosting
CMicrosoft.Extensions.Logging
DSystem.ServiceProcess
Lời giải
Namespace chứa lớp BackgroundService là Microsoft.Extensions.Hosting. Lớp BackgroundService là một lớp cơ bản trong framework .NET Core, được sử dụng để tạo các dịch vụ chạy nền. Nó cho phép bạn tạo các dịch vụ có thể chạy nền mà không cần phải tạo một ứng dụng Windows Service. Để sử dụng BackgroundService, bạn cần thêm Microsoft.Extensions.Hosting vào dự án của mình. Sau đó, bạn có thể tạo một lớp con của BackgroundService và thực hiện các tác vụ cần thiết trong phương thức Run().
Mở trang câu hỏi này →
147What is the primary purpose of a .NET Worker Service?4 lựa chọnDễ100% trả lời đúng
ATo build web applications.
BTo build desktop applications.
CTo build long-running background tasks or services.
DTo build mobile applications.
Lời giải
Một .NET Worker Service là một loại ứng dụng .NET Core được thiết kế để chạy trong nền và thực hiện các tác vụ chạy trong nền lâu dài. Mục đích chính của một .NET Worker Service là chạy các tác vụ nền trong thời gian dài mà không cần tương tác trực tiếp từ người dùng. Điều này có thể bao gồm các tác vụ như gửi email hàng ngày, cập nhật dữ liệu trong cơ sở dữ liệu hoặc thực hiện các tác vụ khác mà không cần người dùng phải chờ đợi. .NET Worker Service cung cấp một cách linh hoạt để xây dựng các ứng dụng chạy trong nền mà không cần phải tạo một ứng dụng web hoặc desktop.
Mở trang câu hỏi này →
ATask.Run()
BIHostedService
CBackgroundService
DWorker Service
Lời giải
Khi thực hiện công việc nền trong thời gian dài trong các controller, chúng ta cần chọn phương pháp phù hợp để tránh gây ra các vấn đề về hiệu suất và bảo trì. Phương pháp Task.Run() không nên được sử dụng cho các công việc nền này vì nó sẽ chiếm dụng luồng chính của ứng dụng và gây ra các vấn đề về hiệu suất. Ngoài ra, Task.Run() không cung cấp các tính năng cần thiết để quản lý và giám sát các công việc nền, chẳng hạn như khả năng bắt đầu và dừng lại, cũng như khả năng phục hồi sau khi ứng dụng bị restart. Thay vào đó, chúng ta nên sử dụng các phương pháp như IHostedService, BackgroundService và Worker Service để thực hiện các công việc nền trong thời gian dài. Những phương pháp này cung cấp các tính năng cần thiết để quản lý và giám sát các công việc nền, giúp chúng ta dễ dàng bảo trì và hiệu suất cao hơn.
Mở trang câu hỏi này →
Abuilder.Services.AddControllers()
Bbuilder.Services.AddRazorPages()
Cbuilder.Services.AddMvc()
Dbuilder.Services.AddViews()
Lời giải
Để đăng ký dịch vụ Razor Pages vào container DI trong Program.cs, bạn cần sử dụng phương thức builder.Services.AddRazorPages(). Phương thức này cho phép ASP.NET Core biết rằng ứng dụng của bạn sử dụng Razor Pages và cần đăng ký các dịch vụ liên quan. Khi bạn gọi phương thức này, các dịch vụ cần thiết cho Razor Pages sẽ được đăng ký vào container DI, bao gồm các dịch vụ như Razor Pages Model, Razor Pages Controller, v.v. Điều này cho phép bạn sử dụng các tính năng của Razor Pages trong ứng dụng của mình.
Mở trang câu hỏi này →
AIController
BIDbContext
CIHostedService
DIViewComponent
Lời giải
Để được đăng ký như một dịch vụ được lưu trữ trong .NET, một lớp phải thực hiện một giao diện cụ thể. Giao diện này cho phép lớp đó được quản lý và chạy trong môi trường ứng dụng. Trong các lựa chọn đã cho, giao diện "IHostedService" là giao diện cần được thực hiện để đăng ký lớp như một dịch vụ được lưu trữ. Giao diện này cung cấp các phương thức để quản lý vòng đời của dịch vụ, chẳng hạn như phương thức StartAsync và StopAsync. Bằng cách thực hiện giao diện này, lớp có thể được đăng ký như một dịch vụ được lưu trữ và chạy trong môi trường ứng dụng.
Mở trang câu hỏi này →
AA unique identifier for a network interface.
BA network protocol.
CA type of network cable.
DA network security measure.
Lời giải
Đáp án đúng: "A unique identifier for a network interface". Địa chỉ IP là một định danh duy nhất gán cho một giao diện mạng của thiết bị trong mạng dùng bộ giao thức TCP/IP, nhờ đó các gói tin biết được nơi gửi và nơi nhận. Một máy có nhiều card mạng sẽ có nhiều địa chỉ IP, đúng theo cách nói "định danh cho một giao diện mạng" chứ không phải cho cả máy. Phương án "A network protocol" nhầm sang khái niệm giao thức - tập quy tắc truyền dữ liệu như TCP hay UDP; phương án "A type of network cable" mô tả phần cứng vật lý là dây cáp; phương án "A network security measure" nhầm sang các biện pháp bảo mật như tường lửa, đều không phải bản chất của địa chỉ IP.
Mở trang câu hỏi này →
AOnGet() only
BOnGetAsync() only
CCompilation error
DRuntime error
Lời giải
Đáp án đúng: "Runtime error". Khi chọn handler, Razor Pages bỏ hậu tố "Async" khỏi tên phương thức. Do đó OnGet và OnGetAsync cùng quy về một handler cho phương thức GET, và bộ chọn DefaultPageHandlerMethodSelector tìm thấy HAI ứng viên cùng khớp nên ném InvalidOperationException với thông báo nhiều handler cùng khớp. Đây là lỗi phát sinh LÚC CHẠY. Trình biên dịch không báo lỗi vì hai phương thức có tên khác nhau là hoàn toàn hợp lệ trong C#, nên phương án "Compilation error" bị loại; và framework không tự ưu tiên bản đồng bộ hay bất đồng bộ, nên "OnGet() only" và "OnGetAsync() only" đều sai.
Mở trang câu hỏi này →
Đề bài
// Controller
public IActionResult Index()
{
   ViewBag.Message = "Hello from ViewBag!";
   ViewData["Title"] = "My Page Title";
   return View();
}

// View
<p>@ViewBag.Message</p>
<h1>@ViewData["Title"]</h1>
ATo store data persistently across multiple requests.
BTo pass data from a controller action to a view.
CTo manage user sessions.
DTo encrypt sensitive data.
Lời giải
Đáp án đúng: "To pass data from a controller action to a view". ViewBag và ViewData là hai cơ chế truyền dữ liệu MỘT CHIỀU từ action của controller sang view trong phạm vi cùng một request: ViewData là từ điển kiểu object nên phải ép kiểu khi dùng, còn ViewBag là lớp bọc dynamic quanh chính từ điển đó nên viết gọn hơn. Cả hai đều mất giá trị ngay khi request kết thúc, vì vậy phương án "To store data persistently across multiple requests" sai - muốn giữ dữ liệu qua nhiều request phải dùng TempData hoặc Session. Quản lý phiên (tức "To manage user sessions") là việc của Session; còn mã hoá dữ liệu (tức "To encrypt sensitive data") không liên quan gì tới hai cơ chế này.
Mở trang câu hỏi này →
ASingleton
BScoped
CTransient
DIsolated
Lời giải
Đáp án đúng: "Transient". Trong DI của ASP.NET Core có ba vòng đời. Transient tạo một thể hiện MỚI mỗi lần được yêu cầu, phù hợp với dịch vụ nhẹ, không giữ trạng thái. Scoped tạo một thể hiện cho mỗi phạm vi, trong ứng dụng web là mỗi HTTP request - điển hình là DbContext. Singleton chỉ tạo một thể hiện duy nhất dùng suốt vòng đời ứng dụng. "Isolated" không phải một vòng đời trong hệ thống DI tích hợp sẵn của .NET.
Mở trang câu hỏi này →
ATCP
BUDP
CHTTP
DFTP
Lời giải
Đáp án đúng: "UDP". UDP là giao thức phi kết nối ở tầng giao vận: nó gửi datagram đi mà không thiết lập kết nối trước, không đánh số thứ tự, không báo nhận và không truyền lại, nên nhanh và nhẹ nhưng không bảo đảm gói tin tới nơi hay tới đúng thứ tự. TCP ngược lại, hướng kết nối với bắt tay ba bước, báo nhận và truyền lại nên bảo đảm tin cậy. HTTP và FTP là giao thức tầng ứng dụng và đều chạy trên nền TCP, do đó thừa hưởng tính tin cậy của TCP.
Mở trang câu hỏi này →
AUses a single processor
BExecutes one instruction at a time
CInstructions are executed sequentially
DAll instructions run in parallel streams
Lời giải
Đáp án đúng: "All instructions run in parallel streams". Tính toán tuần tự nghĩa là chương trình chạy trên MỘT bộ xử lý, các lệnh được thực hiện lần lượt, mỗi thời điểm chỉ một lệnh - đúng như các phát biểu A, B và C. Vì vậy phát biểu "tất cả các lệnh chạy song song trên nhiều luồng" là điều KHÔNG đúng với tính toán tuần tự; đó chính là đặc trưng của tính toán song song, nơi bài toán được chia nhỏ và thực hiện đồng thời trên nhiều lõi hoặc nhiều bộ xử lý. Câu hỏi yêu cầu chọn phát biểu SAI nên đáp án là D.
Mở trang câu hỏi này →
ATo get the IP address of the connected server.
BTo get the port number of the connected server.
CTo get the network stream used for sending and receiving data.
DTo close the connection.
Lời giải
Đáp án đúng: "To get the network stream used for sending and receiving data". TcpClient.GetStream() trả về đối tượng NetworkStream gắn với kết nối TCP đã thiết lập; đây chính là luồng hai chiều để đọc và ghi dữ liệu với đầu bên kia, thường dùng kèm StreamReader/StreamWriter hoặc các phương thức Read/Write trực tiếp. Địa chỉ IP và cổng của phía đối tác lấy qua thuộc tính Client.RemoteEndPoint chứ không phải GetStream. Đóng kết nối là việc của Close() hoặc Dispose(), thường được gọi trong khối using.
Mở trang câu hỏi này →
ATo define database schemas.
BTo handle HTTP requests and provide data to the Razor Page.
CTo manage user sessions.
DTo define user interface layouts.
Lời giải
Đáp án đúng: "To handle HTTP requests and provide data to the Razor Page." PageModel là lớp code-behind của một Razor Page: nó chứa các handler OnGet, OnPost, OnGetAsync... để xử lý request theo phương thức HTTP, chứa các thuộc tính được model binding gán dữ liệu từ request, và cung cấp dữ liệu cho phần giao diện .cshtml truy cập qua @Model. Nói cách khác nó gộp vai trò của controller và view model trong MVC. Định nghĩa lược đồ cơ sở dữ liệu ("To define database schemas.") là việc của entity và DbContext; quản lý phiên ("To manage user sessions.") là của Session; bố cục giao diện ("To define user interface layouts.") do _Layout.cshtml đảm nhiệm.
Mở trang câu hỏi này →
159What is Inversion of Control (IoC)?4 lựa chọn
AA programming paradigm where the control flow of a program is inverted compared to traditional procedural programming.
BA method for managing memory allocation.
CA technique for optimizing network traffic.
DA way to encrypt data.
Lời giải
Đáp án đúng: "the control flow of a program is inverted". Inversion of Control là nguyên lý trong đó luồng điều khiển bị ĐẢO NGƯỢC so với lập trình thủ tục truyền thống: thay vì mã của bạn tự khởi tạo và gọi các thành phần phụ thuộc, framework hoặc container sẽ nắm quyền điều khiển và cung cấp chúng cho bạn - Dependency Injection chính là một cách hiện thực hoá IoC. Nhờ đó lớp chỉ khai báo cái nó cần chứ không quyết định cái nó dùng, giúp giảm ghép nối và dễ kiểm thử. Các phương án "A method for managing memory allocation.", "A technique for optimizing network traffic." và "A way to encrypt data." nói về quản lý bộ nhớ, tối ưu lưu lượng mạng và mã hoá, đều không liên quan.
Mở trang câu hỏi này →
AOnSubmit()
BOnPost()
CSubmitForm()
DPost()
Lời giải
Đáp án đúng: "OnPost()". Razor Pages ánh xạ phương thức HTTP tới handler theo quy ước tên: OnGet cho GET, OnPost cho POST, kèm biến thể bất đồng bộ OnPostAsync và biến thể có tên như OnPostDeleteAsync khi dùng asp-page-handler. Vì biểu mẫu gửi lên bằng POST nên OnPost() là phương thức xử lý. Các tên OnSubmit(), SubmitForm() và Post() không nằm trong quy ước đặt tên handler của Razor Pages nên sẽ không bao giờ được framework gọi tới.
Mở trang câu hỏi này →
AWorker Service integrates better with .NET features like DI and Logging
BWorker Service is UI-based
CWorker Service cannot be published
DWorker Service only runs on Windows
Lời giải
Đáp án đúng: "integrates better with .NET features like DI and Logging". Worker Service là mẫu dự án .NET dựng sẵn Generic Host, nhờ đó có ngay Dependency Injection, Logging, Configuration, IHostedService và quản lý vòng đời khởi động - tắt êm. Đó là lý do chính để chọn nó thay vì viết Windows Service thuần. Phương án "Worker Service is UI-based" sai vì Worker Service không có giao diện; phương án "Worker Service cannot be published" sai vì hoàn toàn xuất bản và cài đặt được như một dịch vụ Windows hoặc systemd; phương án "Worker Service only runs on Windows" sai vì đây là ứng dụng .NET đa nền tảng, chạy được cả trên Linux và trong container.
Mở trang câu hỏi này →
AProgram.cs
BRoutes.razor
CApp.razor
DStartup.cs
Lời giải
Đáp án đúng: "App.razor". Trong các dự án Blazor Server và Blazor WebAssembly, thành phần Router được khai báo trong App.razor: nó nhận AppAssembly để quét các trang có chỉ thị @page, định nghĩa Found và NotFound, và bọc trong RouteView để dựng layout. Program.cs chỉ đăng ký dịch vụ và cấu hình pipeline; Startup.cs là kiểu tổ chức cũ đã bị gộp vào Program.cs từ .NET 6. Lưu ý mẫu Blazor Web App của .NET 8 tách phần Router sang Routes.razor, nhưng trong phạm vi Blazor Server/WebAssembly của môn học thì App.razor là câu trả lời.
Mở trang câu hỏi này →
ABy writing JavaScript code.
BBy installing NuGet packages and configuring the DbContext.
CBy using static HTML files.
DBy using a database management system.
Lời giải
Đáp án đúng: "By installing NuGet packages and configuring the DbContext.". Để dùng Entity Framework Core trong một dự án Blazor Web App, ta cài các gói NuGet cần thiết như Microsoft.EntityFrameworkCore, gói provider tương ứng (SqlServer, Sqlite...) và Microsoft.EntityFrameworkCore.Tools; sau đó định nghĩa lớp DbContext và đăng ký nó vào DI bằng builder.Services.AddDbContext hoặc AddDbContextFactory cùng chuỗi kết nối. Viết JavaScript, như phương án "By writing JavaScript code.", và dùng tệp HTML tĩnh, như phương án "By using static HTML files.", không liên quan tới truy cập dữ liệu; còn phương án "By using a database management system." chỉ nói tới hệ quản trị cơ sở dữ liệu - thứ nằm ở phía máy chủ, không phải cách thêm EF Core vào dự án.
Mở trang câu hỏi này →
AUsing JavaScript only.
BUsing data annotations on the PageModel and validation tag helpers.
CUsing database triggers.
DUsing static HTML validation attributes.
Lời giải
Đáp án đúng: "Using data annotations on the PageModel and validation tag helpers." Cách kiểm tra dữ liệu chuẩn trong Razor Pages là gắn data annotation lên thuộc tính của PageModel ([Required], [StringLength], [Range], [EmailAddress]...), rồi trong .cshtml dùng các tag helper asp-validation-for và asp-validation-summary để hiển thị lỗi; phía handler kiểm tra ModelState.IsValid trước khi xử lý. Cơ chế này chạy cả phía máy chủ lẫn phía trình duyệt. Chỉ dùng JavaScript ("Using JavaScript only.") là không an toàn vì người dùng có thể bỏ qua; trigger cơ sở dữ liệu ("Using database triggers.") quá muộn và sai tầng; thuộc tính HTML tĩnh ("Using static HTML validation attributes.") chỉ là lớp hỗ trợ, không thay được kiểm tra phía máy chủ.
Mở trang câu hỏi này →