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

124/175 câuCòn 51
AThread.Sleep()
BTask.Run() + await
CPLINQ
DBackgroundWorker (obsolete)
Lời giải
Để viết một ứng dụng WPF mà không bị đóng băng giao diện khi fetch dữ liệu từ web, bạn cần sử dụng một kỹ thuật phù hợp. Có một số lựa chọn như sau: Thread.Sleep(), Task.Run() + await, PLINQ và BackgroundWorker (đã lỗi thời). Tuy nhiên, trong số các lựa chọn này, Task.Run() + await là lựa chọn tốt nhất. Bởi vì Task.Run() cho phép bạn chạy một tác vụ nền, trong khi await cho phép bạn chờ đợi kết quả của tác vụ đó mà không bị đóng băng giao diện. Điều này giúp ứng dụng của bạn vẫn hoạt động trơn tru và không bị chậm lại khi fetch dữ liệu từ web.
Mở trang câu hỏi này →
106Which architecture does a mono-processor system use?4 lựa chọnDễ86% trả lời đúng
AVon Neumann architecture
BHarvard architecture
CMIMD
DSIMD
Lời giải
Một hệ thống máy tính mono-processor sử dụng kiến trúc Von Neumann. Kiến trúc này được đặt theo tên của nhà toán học người Hungary John von Neumann. Trong kiến trúc Von Neumann, bộ nhớ chính và bộ xử lý nằm trên cùng một mạch, điều này cho phép dữ liệu được đọc từ bộ nhớ và thực hiện các phép toán trên dữ liệu đó. Điều này giúp giảm thiểu thời gian và tăng hiệu suất của hệ thống. Ngoài ra, kiến trúc Von Neumann cũng cho phép hệ thống thực hiện các phép toán logic và tính toán phức tạp. Nó là một trong những kiến trúc cơ bản của máy tính và được sử dụng rộng rãi trong nhiều loại hệ thống máy tính khác nhau.
Mở trang câu hỏi này →
AA new instance of FileLogger is created each time
BThe same FileLogger instance is shared across the application
CA new FileLogger instance is created per request
DThe instance is disposed immediately
Lời giải
Khi dịch vụ AddSingleton được sử dụng, nó sẽ tạo một đối tượng FileLogger duy nhất và chia sẻ nó cho tất cả các lớp trong ứng dụng. Điều này có nghĩa là khi ILogger được inject vào các lớp khác nhau, tất cả chúng sẽ sử dụng cùng một đối tượng FileLogger. Điều này giúp giảm thiểu việc tạo và quản lý các đối tượng, đồng thời cải thiện hiệu suất của ứng dụng. Tuy nhiên, cần lưu ý rằng AddSingleton không đảm bảo rằng đối tượng sẽ tồn tại mãi mãi, mà chỉ là một đối tượng được tạo và chia sẻ trong suốt vòng đời của ứng dụng.
Mở trang câu hỏi này →
108Consider this C# code:4 lựa chọncó codeDễ100% trả lời đúng
Đề bài
services.AddTransient<IEmailService, SmtpEmailService>();

What happens when IEmailService is requested multiple times?

AOnly one instance is ever created
BA new instance is created each time it's requested
COne instance per request is created
DThe DI container throws an exception
Lời giải
Khi bạn sử dụng phương thức AddTransient trong Dependency Injection (DI) của C#, nó sẽ tạo ra một đối tượng thực thi IEmailService (SmtpEmailService) mỗi khi bạn yêu cầu nó. Điều này có nghĩa là mỗi lần bạn yêu cầu IEmailService, một đối tượng mới sẽ được tạo ra. Nếu bạn yêu cầu IEmailService nhiều lần, sẽ có nhiều đối tượng SmtpEmailService được tạo ra. Điều này khác với các phương thức khác như AddScoped hoặc AddSingleton, nơi đối tượng sẽ được tạo ra một lần và sử dụng nhiều lần.
Mở trang câu hỏi này →
109What is "Property Injection"?4 lựa chọnDễ71% trả lời đúng
AInjecting dependencies via constructors.
BInjecting dependencies via method parameters.
CInjecting dependencies by setting public properties.
DInjecting dependencies at compile time.
Lời giải
Property Injection là một kỹ thuật trong lập trình hướng đối tượng, cho phép bạn cung cấp các phụ thuộc (dependencies) cho một đối tượng bằng cách thiết lập các thuộc tính công khai của nó. Điều này cho phép bạn tách rời việc tạo ra phụ thuộc khỏi việc tạo ra đối tượng chính, giúp tăng tính linh hoạt và dễ dàng bảo trì trong thiết kế hệ thống. Ví dụ, khi bạn muốn tạo một đối tượng User, bạn có thể sử dụng Property Injection để cung cấp cho nó một đối tượng Database để truy cập dữ liệu. Điều này giúp giảm thiểu sự phụ thuộc giữa các lớp và tăng cường khả năng tái sử dụng.
Mở trang câu hỏi này →
110Which built-in container does .NET Core provide for DI?4 lựa chọnDễ100% trả lời đúng
AAutofac
BUnity
CMicrosoft.Extensions.DependencyInjection
DNinject
Lời giải
Trong .NET Core, có một số container được sử dụng để quản lý Dependency Injection (DI). Tuy nhiên, container được tích hợp sẵn và được khuyến nghị sử dụng là Microsoft.Extensions.DependencyInjection. Nó cung cấp các tính năng cơ bản để quản lý các đối tượng và dịch vụ trong ứng dụng. Container này cho phép bạn dễ dàng thêm, xóa và quản lý các dịch vụ mà không cần phải viết mã phức tạp. Ngoài ra, nó cũng hỗ trợ các tính năng như đăng ký dịch vụ, tạo đối tượng và quản lý vòng đời của các đối tượng. Sử dụng Microsoft.Extensions.DependencyInjection giúp bạn có thể tập trung vào việc phát triển ứng dụng mà không cần phải lo lắng về việc quản lý các dịch vụ và đối tượng.
Mở trang câu hỏi này →
111Which protocol is typically included at the start of a URL?4 lựa chọnDễ90% trả lời đúng
AHTTP/HTTPS
BTCP/UDP
CFTP
DAll of the above
Lời giải
Để trả lời câu hỏi này, chúng ta cần hiểu về cấu trúc của một URL (Uniform Resource Locator). URL là một chuỗi ký tự dùng để xác định vị trí của một tài nguyên trên Internet. Cấu trúc của URL thường bao gồm các phần sau: protocol, domain, path, query và fragment. Trong đó, protocol là phần đầu tiên của URL, xác định giao thức sử dụng để truy cập tài nguyên.
Mở trang câu hỏi này →
112Which .NET class is used for creating a UDP client?4 lựa chọnDễ100% trả lời đúng
ATcpListener
BUdpClient
CTcpClient
DSocket
Lời giải
Để tạo một khách hàng UDP trong .NET, bạn cần sử dụng lớp UdpClient. Lớp này cung cấp các phương thức để gửi và nhận dữ liệu UDP. Bạn có thể sử dụng nó để tạo một ứng dụng UDP client đơn giản hoặc phức tạp hơn. Lớp UdpClient được sử dụng rộng rãi trong các ứng dụng mạng, chẳng hạn như trò chơi trực tuyến, ứng dụng truyền phát video và ứng dụng mạng xã hội.
Mở trang câu hỏi này →
113What is the purpose of a port number in networking?4 lựa chọnDễ80% trả lời đúng
ATo identify a specific network.
BTo identify a specific application or service on a host.
CTo route network traffic.
DTo encrypt network data.
Lời giải
Số cổng (port number) trong mạng là một số duy nhất được sử dụng để xác định một ứng dụng hoặc dịch vụ cụ thể trên một máy chủ. Mỗi ứng dụng hoặc dịch vụ có thể được kết nối qua một số cổng khác nhau. Ví dụ, ứng dụng email thường sử dụng số cổng 25, trong khi ứng dụng web thường sử dụng số cổng 80. Số cổng giúp phân biệt các ứng dụng hoặc dịch vụ khác nhau trên cùng một máy chủ, từ đó giúp hệ thống mạng phân phối và quản lý lưu lượng mạng một cách hiệu quả.
Mở trang câu hỏi này →
114What is a "firewall" in network security?4 lựa chọnDễ100% trả lời đúng
AA device that routes network traffic.
BA system designed to prevent unauthorized access to or from a private network.
CA network protocol.
DA type of network cable.
Lời giải
Một firewall trong bảo mật mạng là một hệ thống được thiết kế để ngăn chặn truy cập không được phép vào hoặc từ một mạng riêng tư. Nó hoạt động như một rào cản giữa mạng riêng tư và mạng công cộng, ngăn chặn các gói tin không mong muốn hoặc có hại từ mạng công cộng vào mạng riêng tư. Firewall thường được sử dụng để bảo vệ các hệ thống và dữ liệu nhạy cảm khỏi các cuộc tấn công mạng, như tấn công từ chối dịch vụ (DDoS), tấn công xâm nhập (hacking), v.v. Nó cũng có thể được sử dụng để kiểm soát lưu lượng truy cập vào và ra khỏi mạng riêng tư, dựa trên các quy tắc và chính sách được thiết lập.
Mở trang câu hỏi này →
115The WebRequest.Create(Uri) method is used to:4 lựa chọnDễ100% trả lời đúng
AInitialize a new WebRequest for a specific URI scheme
BOpen a database connection
CCreate a physical network cable
DDefine hardware IP addressing
Lời giải
Método WebRequest.Create(Uri) được sử dụng để tạo một yêu cầu Web mới cho một lược đồ URI cụ thể. Lược đồ URI là một phần quan trọng trong việc xác định địa chỉ URL của một trang web. Khi bạn tạo một yêu cầu Web mới, bạn cần cung cấp một lược đồ URI để xác định loại yêu cầu mà bạn muốn thực hiện. Ví dụ, nếu bạn muốn tải một trang web, bạn sẽ sử dụng lược đồ HTTP, còn nếu bạn muốn tải một tệp tin từ một máy chủ FTP, bạn sẽ sử dụng lược đồ FTP. Phương thức WebRequest.Create(Uri) cho phép bạn tạo một yêu cầu Web mới cho một lược đồ URI cụ thể, giúp bạn thực hiện các yêu cầu Web một cách linh hoạt và hiệu quả.
Mở trang câu hỏi này →
116What is HttpClient designed for?4 lựa chọnDễ100% trả lời đúng
AConsuming HTTP web APIs
BHandling low-level TCP sockets
CEncrypting HTTP traffic
DServing static files
Lời giải
HttpClient là một lớp trong .NET Framework được thiết kế để giúp lập trình viên dễ dàng sử dụng và quản lý các yêu cầu HTTP. Nó cho phép bạn gửi và nhận dữ liệu từ các API web HTTP một cách dễ dàng và hiệu quả. HttpClient cung cấp các tính năng như quản lý kết nối, quản lý yêu cầu và phản hồi, cũng như hỗ trợ các phương thức HTTP khác nhau như GET, POST, PUT, DELETE, v.v. Nó cũng hỗ trợ các tính năng như tự động hóa quá trình tải xuống và tải lên tệp, cũng như hỗ trợ các giao thức HTTP khác nhau như HTTP/1.1 và HTTP/2. Tóm lại, HttpClient được thiết kế để giúp lập trình viên dễ dàng sử dụng và quản lý các yêu cầu HTTP, giúp giảm thiểu thời gian và công sức trong quá trình phát triển ứng dụng.
Mở trang câu hỏi này →
117Consider this C# code:4 lựa chọncó codeDễ89% trả lời đúng
Đề bài
services.AddScoped<IRepository, CustomerRepository>();

In an ASP.NET Core web app, how often is CustomerRepository created?

AOnce per application
BOnce per request
COnce per controller
DEvery time it's injected
Lời giải
Trong ASP.NET Core, khi bạn sử dụng phương thức AddScoped trong dịch vụ Dependency Injection, thì đối tượng được tạo ra sẽ được lưu giữ trong suốt vòng đời của yêu cầu HTTP. Điều này có nghĩa là đối tượng sẽ được tạo ra một lần khi ứng dụng nhận được yêu cầu HTTP đầu tiên và sẽ được sử dụng cho đến khi yêu cầu HTTP đó được hoàn tất. Sau đó, đối tượng sẽ được hủy bỏ và tái tạo lại khi ứng dụng nhận được yêu cầu HTTP tiếp theo. Vì vậy, trong trường hợp của bạn, đối tượng CustomerRepository sẽ được tạo ra một lần khi ứng dụng nhận được yêu cầu HTTP đầu tiên và sẽ được sử dụng cho đến khi yêu cầu HTTP đó được hoàn tất.
Mở trang câu hỏi này →
118Consider this C# code:4 lựa chọncó codeDễ78% trả lời đúng
Đề bài
public IActionResult Index() {
  ViewData["Count"] = "10";
  return View();
}

In Razor: <p>@((int)ViewData["Count"] + 5)</p> What happens?

ADisplays 15
BDisplays 105
CInvalidCastException
DNothing
Lời giải
Khi chạy đoạn mã trên, chúng ta sẽ gặp một lỗi. Lỗi này xảy ra vì trong đoạn mã C#, chúng ta đã gán giá trị "10" vào ViewData với key là "Count". Tuy nhiên, trong Razor, chúng ta đã cố gắng ép giá trị này thành một số nguyên (int) để thực hiện phép tính cộng. Nhưng "10" không phải là một số nguyên, mà là một chuỗi. Do đó, khi chúng ta cố gắng ép nó thành int, sẽ xảy ra lỗi InvalidCastException.
Mở trang câu hỏi này →
A[Compare]
B[Required]
C[StringLength]
D[Range]
Lời giải
Để xác minh hai thuộc tính trong một mô hình khớp nhau, bạn cần sử dụng thuộc tính [Compare]. Ví dụ, khi bạn muốn đảm bảo rằng mật khẩu và xác nhận mật khẩu phải trùng nhau, bạn có thể sử dụng [Compare] để thực hiện việc này. Ngoài ra, [Compare] cũng có thể được sử dụng để xác minh các thuộc tính khác như email hoặc số điện thoại.
Mở trang câu hỏi này →
A"Views"
B"Models"
C"Controllers"
D"wwwroot"
Lời giải
Trong một dự án ASP.NET Core MVC, thư mục thường chứa các tệp tin tĩnh (CSS, JavaScript, hình ảnh) là "wwwroot". Thư mục này được sử dụng để lưu trữ các tệp tin tĩnh mà không cần phải biên dịch lại khi chạy ứng dụng. Điều này giúp tăng tốc độ tải trang và giảm thiểu thời gian chờ đợi. Ngoài ra, thư mục "wwwroot" cũng có thể chứa các tệp tin khác như hình ảnh, video, âm thanh, v.v. Nó là một phần quan trọng của cấu trúc dự án ASP.NET Core MVC và giúp tạo điều kiện thuận lợi cho việc phát triển và triển khai ứng dụng.
Mở trang câu hỏi này →
121What is the purpose of the @ symbol in Razor syntax?4 lựa chọnDễ100% trả lời đúng
ATo define a CSS rule.
BTo indicate a JavaScript block.
CTo switch between HTML and C# code.
DTo define a database query.
Lời giải
Trong Razor syntax, @ được sử dụng để chỉ định chuyển đổi giữa mã HTML và mã C# code. Khi bạn sử dụng @ trước một đoạn mã C#, nó sẽ được biên dịch thành mã HTML có thể được trình duyệt hiểu. Điều này cho phép bạn dễ dàng kết hợp mã C# và mã HTML trong một file Razor. Ví dụ, bạn có thể sử dụng @ để hiển thị giá trị của một biến C# trong một thẻ HTML. Ngoài ra, @ còn được sử dụng để gọi các phương thức của một đối tượng C# và hiển thị kết quả trong một thẻ HTML. Tóm lại, @ là một ký tự quan trọng trong Razor syntax, giúp bạn dễ dàng kết hợp mã C# và mã HTML trong một file.
Mở trang câu hỏi này →
122What is the purpose of the [Bind] attribute in ASP.NET Core MVC?4 lựa chọnDễ100% trả lời đúng
ATo specify which properties of a model should be bound from the request.
BTo encrypt data.
CTo manage database connections.
DTo manage user sessions.
Lời giải
Trong ASP.NET Core MVC, [Bind] là một thuộc tính quan trọng giúp xác định các thuộc tính của mô hình (model) nào sẽ được liên kết (bound) từ yêu cầu (request). Điều này cho phép bạn kiểm soát dữ liệu được gửi từ client đến server và ngăn chặn các thuộc tính không mong muốn được liên kết. Ví dụ, khi bạn tạo một form để thêm mới một tài khoản mới, bạn có thể sử dụng [Bind] để chỉ liên kết các thuộc tính cần thiết như tên, địa chỉ email và mật khẩu, mà không liên kết các thuộc tính khác như ID hoặc ngày tạo.
Mở trang câu hỏi này →
123Which statement is true about Model Binding in Razor Pages?4 lựa chọnDễ100% trả lời đúng
AOnly works with GET requests
BMaps HTTP request data to PageModel properties
CMust always use TempData
DCannot bind form values
Lời giải
Model Binding trong Razor Pages là một tính năng cho phép ánh xạ dữ liệu từ yêu cầu HTTP đến các thuộc tính của PageModel. Điều này cho phép bạn dễ dàng lấy dữ liệu từ yêu cầu HTTP và sử dụng nó trong trang Razor Pages của mình. Ví dụ, nếu bạn có một trang Razor Pages với một form và bạn muốn lấy dữ liệu từ form đó, bạn có thể sử dụng Model Binding để ánh xạ dữ liệu từ form đến các thuộc tính của PageModel. Điều này giúp giảm thiểu mã code và làm cho trang Razor Pages của bạn trở nên dễ dàng hơn để quản lý.
Mở trang câu hỏi này →
124Which statement is correct about Model Binding?4 lựa chọnDễ100% trả lời đúng
AIt only works with query strings
BIt maps HTTP request data to controller action parameters
CIt must always use TempData
DIt cannot bind complex types
Lời giải
Model Binding trong ASP.NET là một tính năng giúp ánh xạ dữ liệu từ yêu cầu HTTP đến các tham số của hành động controller. Điều này cho phép bạn dễ dàng lấy dữ liệu từ các nguồn khác nhau như query string, form data, JSON, v.v. và ánh xạ nó vào các tham số của hành động controller. Ví dụ, nếu bạn có một hành động controller với tham số tên 'name', Model Binding sẽ ánh xạ giá trị của 'name' từ query string hoặc form data vào tham số 'name' của hành động controller. Điều này giúp giảm thiểu số lượng mã cần thiết để ánh xạ dữ liệu và làm cho mã của bạn trở nên dễ đọc và dễ bảo trì hơn.
Mở trang câu hỏi này →