Danh sách câu hỏi của đề

Câu hỏi: PRN222 Lập trình ứng dụng đa nền tảng nâng cao với .NET – Bộ ôn tập cuối kỳ số 3

50 câu trắc nghiệm kèm lời giải của môn 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, xếp đúng thứ tự trong đề.

Danh sách câu hỏi

20/50 câuCòn 30
1What is the purpose of the User feature in SignalR?4 lựa chọnDễ100% trả lời đúng
ATo manage database connections.
BTo send messages to clients based on their authenticated user identity.
CTo encrypt data.
DTo manage user sessions.
Lời giải
Đáp án đúng: "To send messages to clients based on their authenticated user identity.". Trong SignalR, Clients.User(userId) gửi tin tới mọi kết nối thuộc về một người dùng đã xác thực, định danh lấy từ claim NameIdentifier qua IUserIdProvider mặc định, nên một người mở nhiều tab hay nhiều thiết bị vẫn nhận đủ tin mà máy chủ không phải tự theo dõi từng ConnectionId. "To manage database connections." sai vì kết nối cơ sở dữ liệu do DbContext hoặc ADO.NET quản lý, SignalR không chạm tới. "To encrypt data." sai vì mã hoá đường truyền là việc của HTTPS/TLS bên dưới kết nối WebSocket, tính năng User không mã hoá gì. "To manage user sessions." sai vì phiên (session) do middleware Session và cookie xác thực của ASP.NET Core duy trì, tính năng User chỉ dùng danh tính đã có sẵn để định tuyến tin nhắn chứ không tạo hay giữ phiên.
Mở trang câu hỏi này →
2What is the purpose of the await keyword in C#?4 lựa chọnDễ100% trả lời đúng
ATo define a constant.
BTo pause execution until an asynchronous operation completes.
CTo create a new thread.
DTo handle exceptions.
Lời giải
Đáp án đúng: "To pause execution until an asynchronous operation completes.". Trong phương thức async, await tạm dừng phần còn lại của phương thức cho tới khi Task được chờ hoàn tất nhưng không chặn luồng: luồng được trả về cho bên gọi hoặc thread pool, phần tiếp nối (continuation) chạy khi tác vụ xong. "To define a constant." sai vì hằng số khai báo bằng const hoặc readonly. "To create a new thread." sai vì await không tạo luồng nào, muốn đẩy việc sang luồng của thread pool phải dùng Task.Run, còn tác vụ I/O thường không chiếm luồng trong lúc chờ. "To handle exceptions." sai vì xử lý ngoại lệ là việc của try/catch/finally, await chỉ ném lại ngoại lệ của Task để khối try/catch bao quanh bắt được chứ bản thân nó không xử lý.
Mở trang câu hỏi này →
3Which code will block the current thread?4 lựa chọnDễ
Aawait task;
Btask.Wait();
Ctask.ContinueWith(...)
Dawait Task.WhenAll(tasks);
Lời giải

Đáp án đúng: "task.Wait(); ". Task.Wait là lời gọi đồng bộ: luồng hiện tại đứng chờ (bị chặn, block) tới khi tác vụ kết thúc và không làm được việc gì khác, nên trong ứng dụng giao diện hay ASP.NET nó dễ làm đứng màn hình, cạn thread pool hoặc gây deadlock. "await task; " không chặn vì phương thức chỉ tạm dừng, luồng được trả lại cho bên gọi và phần sau chạy khi task xong. "task.ContinueWith(...)" không chặn vì nó chỉ đăng ký một phần tiếp nối sẽ chạy khi task hoàn tất rồi trả về ngay một Task mới. "await Task.WhenAll(tasks); " cũng không chặn: WhenAll tạo một Task hoàn tất khi mọi tác vụ trong danh sách xong và await chờ nó theo kiểu bất đồng bộ, bản chặn luồng tương ứng là Task.WaitAll.

Mở trang câu hỏi này →
4How do you inject a service into a Razor PageModel?4 lựa chọnDễ100% trả lời đúng
ABy directly creating an instance of the service.
BBy adding the service as a constructor parameter.
CBy using global variables.
DBy using static methods.
Lời giải
Đáp án đúng: "By adding the service as a constructor parameter.". ASP.NET Core dùng constructor injection (tiêm qua hàm khởi tạo): dịch vụ được đăng ký trong Program.cs bằng builder.Services.AddScoped hay AddTransient, khi tạo PageModel container DI đọc tham số của hàm khởi tạo và truyền vào thể hiện phù hợp, PageModel thường gán nó vào một trường private readonly để handler dùng. "By directly creating an instance of the service." sai vì gọi new khiến lớp gắn chặt với một triển khai cụ thể, bỏ qua vòng đời do container quản lý và khó thay bằng bản giả khi kiểm thử. "By using global variables." sai vì C# không có biến toàn cục đúng nghĩa, trạng thái dùng chung kiểu đó không an toàn luồng và không đi qua DI. "By using static methods." sai vì gọi phương thức static là phụ thuộc cứng, không có vòng đời Scoped hay Transient và không thể tiêm vào.
Mở trang câu hỏi này →
5DNS converts a domain name into:4 lựa chọn
AA URL
BAn IP address
CA MAC address
DA hostname
Lời giải
Đáp án đúng: "An IP address". DNS (Domain Name System, hệ thống phân giải tên miền) tra bản ghi A (IPv4) hoặc AAAA (IPv6) để đổi một tên miền như example.com thành địa chỉ IP mà máy tính dùng để định tuyến gói tin. "A URL" sai vì URL là chuỗi chứa cả giao thức, tên miền và đường dẫn, DNS không sinh ra URL mà chỉ phân giải phần tên máy nằm trong nó. "A MAC address" sai vì địa chỉ MAC là địa chỉ phần cứng ở tầng liên kết, được tìm từ địa chỉ IP bằng giao thức ARP trong mạng cục bộ chứ không qua DNS. "A hostname" sai vì tên máy chính là đầu vào của DNS, chỉ có truy vấn ngược bản ghi PTR mới đổi IP thành tên, còn câu hỏi hỏi chiều từ tên miền sang địa chỉ.
Mở trang câu hỏi này →
6Which namespace must be imported to use Hub?4 lựa chọnTrung bình67% trả lời đúng
AMicrosoft.Extensions.DependencyInjection
BMicrosoft.AspNetCore.SignalR
CSystem.Threading.Tasks
DMicrosoft.AspNetCore.Mvc
Lời giải
Đáp án đúng: "Microsoft.AspNetCore.SignalR". Lớp Hub, Hub có kiểu client mạnh, IHubContext và đối tượng Clients đều nằm trong không gian tên (namespace) Microsoft.AspNetCore.SignalR, nên tệp khai báo lớp ChatHub kế thừa Hub phải có chỉ thị using tới namespace này (hoặc khai báo global using). "Microsoft.Extensions.DependencyInjection" sai vì nó chứa IServiceCollection và các phương thức mở rộng đăng ký dịch vụ, kể cả AddSignalR, nhưng không chứa lớp Hub. "System.Threading.Tasks" sai vì nó chứa Task, kiểu trả về của các phương thức hub, chứ không chứa Hub. "Microsoft.AspNetCore.Mvc" sai vì nó chứa Controller, IActionResult và các thành phần của MVC, không liên quan tới hub thời gian thực.
Mở trang câu hỏi này →
AThe response received from a server after a WebRequest.
BThe network configuration settings.
CThe data sent to a server.
DThe client-side application.
Lời giải
Đáp án đúng: "The response received from a server after a WebRequest.". Trong System.Net, WebResponse là lớp cơ sở trừu tượng cho phản hồi, được trả về bởi WebRequest.GetResponse hoặc GetResponseAsync, lớp con HttpWebResponse cho biết mã trạng thái, header và có GetResponseStream để đọc nội dung máy chủ gửi về (ngày nay HttpClient được khuyên dùng thay cho cặp lớp này). "The network configuration settings." sai vì thiết lập mạng thuộc các lớp như ServicePointManager hay namespace System.Net.NetworkInformation. "The data sent to a server." sai vì đó là phía WebRequest: dữ liệu gửi đi được ghi vào luồng lấy từ GetRequestStream. "The client-side application." sai vì WebResponse chỉ là một đối tượng chứa dữ liệu phản hồi, không đại diện cho ứng dụng nào.
Mở trang câu hỏi này →
8How are handler methods typically named in a Razor PageModel?4 lựa chọnDễ100% trả lời đúng
AHandleGet(), HandlePost()
BOnGet(), OnPost()
CGetHandler(), PostHandler()
DProcessGet(), ProcessPost()
Lời giải
Đáp án đúng: "OnGet(), OnPost()". Razor Pages tìm handler theo quy ước tiền tố On cộng động từ HTTP, có thể thêm tên handler và hậu tố Async: OnGet chạy khi trang nhận request GET, OnPost chạy khi form gửi POST, ngoài ra có OnGetAsync, OnPostAsync và handler đặt tên như OnPostDelete được chọn qua asp-page-handler. "HandleGet(), HandlePost()" sai vì tiền tố Handle không nằm trong quy ước, request GET tới trang sẽ không gọi tới HandleGet. "GetHandler(), PostHandler()" sai vì đặt động từ lên trước và thêm hậu tố Handler là ngược quy ước, framework nhận diện bằng tiền tố On chứ không bằng chữ Handler. "ProcessGet(), ProcessPost()" sai vì Process cũng không phải tiền tố được nhận, các phương thức này chỉ là phương thức public thường mà trang không tự gọi.
Mở trang câu hỏi này →
AStartup.cs
B_Imports.razor
CProgram.cs
DApp.razor
Lời giải
Đáp án đúng: "_Imports.razor". Tệp _Imports.razor chứa các chỉ thị @using (cùng @inject, @layout khi cần) áp dụng cho mọi component .razor trong cùng thư mục và các thư mục con, nhờ vậy namespace dùng chung chỉ khai báo một lần thay vì lặp ở đầu từng component. "Startup.cs" sai vì đó là tệp cấu hình dịch vụ và pipeline của mẫu dự án cũ (từ .NET 5 trở về trước), không khai báo namespace cho component. "Program.cs" sai vì đó là điểm vào ứng dụng nơi đăng ký dịch vụ và middleware, chỉ thị using trong đó chỉ có hiệu lực trong chính tệp C# ấy (trừ khi viết global using). "App.razor" sai vì đó là component gốc chứa Router hoặc khung HTML của Blazor Web App, không phải nơi khai báo using dùng chung.
Mở trang câu hỏi này →
10What 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
Đáp án đúng: "To switch between HTML and C# code.". Trong Razor, ký tự @ chuyển từ markup HTML sang C#: @Model.Name in giá trị một biểu thức, @(a + b) là biểu thức tường minh, @if và @foreach mở cấu trúc điều khiển, còn @ kèm cặp ngoặc nhọn mở một khối nhiều câu lệnh. Muốn in đúng ký tự @ ra trang thì viết @@. "To define a CSS rule." sai vì CSS viết trong thẻ style hoặc tệp .css, thậm chí trong khối CSS phải gõ @@media để Razor không hiểu nhầm. "To indicate a JavaScript block." sai vì JavaScript đặt trong thẻ script, Razor không dùng @ để đánh dấu mã JS. "To define a database query." sai vì truy vấn cơ sở dữ liệu viết bằng C# (LINQ, EF Core) trong PageModel hoặc controller, @ chỉ là cú pháp chuyển ngữ cảnh, không gắn với cơ sở dữ liệu.
Mở trang câu hỏi này →
11Which protocol is connection-oriented and ensures reliable data transfer?4 lựa chọnDễ100% trả lời đúng
AUDP
BIP
CTCP
DHTTP
Lời giải
Đáp án đúng: "TCP". TCP (Transmission Control Protocol) thiết lập kết nối bằng bắt tay ba bước SYN, SYN-ACK, ACK rồi mới truyền, đánh số thứ tự từng đoạn, chờ xác nhận, truyền lại đoạn bị mất, kiểm soát luồng và tắc nghẽn, nên dữ liệu tới đủ và đúng thứ tự. "UDP" sai vì nó phi kết nối, gửi datagram không cần xác nhận và không truyền lại, đổi độ tin cậy lấy tốc độ cho truyền phát video, DNS hay game. "IP" sai vì đó là giao thức tầng mạng chỉ gán địa chỉ và định tuyến từng gói theo kiểu cố gắng hết sức (best-effort), không bảo đảm gói tới nơi. "HTTP" sai vì đó là giao thức tầng ứng dụng, độ tin cậy có được là nhờ HTTP/1.1 và HTTP/2 chạy trên TCP chứ bản thân HTTP không thiết lập kết nối tin cậy, HTTP/3 còn chạy trên QUIC dựa trên UDP.
Mở trang câu hỏi này →
12ViewData in Razor Pages is:4 lựa chọnDễ
AA list of HTML helpers
BA dictionary for passing data from PageModel to Razor Page
CA type of middleware
DA static variable shared by all pages
Lời giải
Đáp án đúng: "A dictionary for passing data from PageModel to Razor Page". ViewData là một ViewDataDictionary, tức từ điển khoá chuỗi với giá trị kiểu object: handler trong PageModel gán giá trị theo khoá (ví dụ Title), trang .cshtml hoặc layout đọc lại theo đúng khoá đó và ép kiểu khi cần, thuộc tính có attribute ViewData cũng được đưa vào từ điển này. "A list of HTML helpers" sai vì HTML helper là các phương thức của IHtmlHelper như Html.DisplayFor hoặc tag helper, không phải ViewData. "A type of middleware" sai vì middleware là thành phần trong pipeline HTTP đăng ký bằng các lời gọi app.Use, còn ViewData chỉ tồn tại trong lúc render một trang. "A static variable shared by all pages" sai vì ViewData được tạo mới cho mỗi request, không static và không chia sẻ giữa các trang hay người dùng.
Mở trang câu hỏi này →
ATo manage database transactions.
BTo allow the service to be gracefully stopped.
CTo encrypt data.
DTo manage user sessions.
Lời giải
Đáp án đúng: "To allow the service to be gracefully stopped.". BackgroundService.ExecuteAsync nhận stoppingToken, token này được kích hoạt khi host gọi StopAsync lúc ứng dụng tắt (Ctrl+C, SIGTERM, dừng Windows Service). Vòng lặp của worker kiểm tra IsCancellationRequested và truyền token vào Task.Delay hay các lời gọi bất đồng bộ để thoát sớm, dọn dẹp và kết thúc gọn gàng thay vì bị cắt ngang giữa chừng. "To manage database transactions." sai vì giao dịch dùng BeginTransaction của DbContext hoặc TransactionScope, token chỉ báo hiệu huỷ thao tác. "To encrypt data." sai vì mã hoá thuộc System.Security.Cryptography, token không liên quan. "To manage user sessions." sai vì worker service chạy nền không có người dùng hay phiên HTTP nào, token chỉ là tín hiệu dừng.
Mở trang câu hỏi này →
ATo manage user sessions.
BTo represent a database session and provide methods for querying and saving data.
CTo encrypt data.
DTo render UI components.
Lời giải
Đáp án đúng: "To represent a database session and provide methods for querying and saving data.". DbContext của EF Core đại diện cho một phiên làm việc với cơ sở dữ liệu: nó giữ các DbSet để truy vấn bằng LINQ, theo dõi thay đổi (change tracking) của thực thể và ghi xuống bằng SaveChanges hoặc SaveChangesAsync như một đơn vị công việc. Trong Blazor, component sống lâu nên tài liệu khuyên dùng IDbContextFactory để tạo DbContext ngắn hạn cho từng thao tác. "To manage user sessions." sai vì phiên người dùng thuộc về xác thực và AuthenticationStateProvider, chữ phiên ở đây là phiên với cơ sở dữ liệu. "To encrypt data." sai vì EF Core không mã hoá dữ liệu, việc đó do TLS hoặc Data Protection đảm nhận. "To render UI components." sai vì hiển thị là việc của component .razor và bộ render của Blazor, DbContext không biết gì về giao diện.
Mở trang câu hỏi này →
AAddSignalR()
BUseSignalR()
CConfigureSignalR()
DEnableSignalR()
Lời giải
Đáp án đúng: "AddSignalR()". Lời gọi builder.Services.AddSignalR() đăng ký các dịch vụ của SignalR như HubLifetimeManager, bộ giao thức JSON và IHubContext vào container DI, sau đó mới dùng app.MapHub kèm đường dẫn để ánh xạ hub vào pipeline. "UseSignalR()" sai vì đó là phương thức middleware của ASP.NET Core 2.x đã bị bỏ, được thay bằng MapHub trong endpoint routing, và dù sao các phương thức Use cũng chỉ cấu hình pipeline chứ không đăng ký dịch vụ. "ConfigureSignalR()" sai vì không tồn tại phương thức nào tên như vậy trong API của ASP.NET Core. "EnableSignalR()" sai vì cũng không tồn tại, quy ước của ASP.NET Core là Add cho đăng ký dịch vụ, Use và Map cho pipeline, không có tiền tố Enable.
Mở trang câu hỏi này →
16What does the IActionResult interface represent?4 lựa chọnDễ100% trả lời đúng
AA database connection.
BThe result of an action method.
CA user session.
DA network request.
Lời giải
Đáp án đúng: "The result of an action method.". IActionResult là giao diện mô tả kết quả của một action, có duy nhất phương thức ExecuteResultAsync để ghi phản hồi HTTP. Action khai báo trả về IActionResult có thể trả về nhiều loại kết quả tuỳ nhánh logic như ViewResult, JsonResult, RedirectToActionResult hay NotFoundResult, framework gọi kết quả đó để tạo phản hồi. "A database connection." sai vì kết nối cơ sở dữ liệu là DbConnection hoặc DbContext. "A user session." sai vì phiên người dùng là ISession lấy qua HttpContext.Session. "A network request." sai vì request gửi đến được biểu diễn bởi HttpRequest trong HttpContext, còn IActionResult thuộc chiều phản hồi do action sinh ra.
Mở trang câu hỏi này →
17Consider this C# code:4 lựa chọncó codeDễ
Đề 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
Đáp án đúng: "A new instance is created each time it’s requested". AddTransient đăng ký vòng đời Transient: mỗi lần container được yêu cầu IEmailService, dù qua tham số hàm khởi tạo hay qua GetService, nó tạo một SmtpEmailService mới, kể cả hai lần yêu cầu trong cùng một request. "Only one instance is ever created" sai vì đó là hành vi của Singleton đăng ký bằng AddSingleton. "One instance per request is created" sai vì đó là Scoped đăng ký bằng AddScoped, mỗi scope một thể hiện và trong ứng dụng web mỗi request HTTP là một scope. "The DI container throws an exception" sai vì lời đăng ký hoàn toàn hợp lệ, container chỉ báo lỗi khi SmtpEmailService cần một phụ thuộc chưa được đăng ký hoặc khi Singleton bắt giữ dịch vụ Scoped.
Mở trang câu hỏi này →
18What is the primary advantage of asynchronous programming?4 lựa chọnDễ100% trả lời đúng
AIncreased CPU usage.
BImproved responsiveness and reduced blocking.
CSimplified debugging.
DReduced memory consumption.
Lời giải
Đáp án đúng: "Improved responsiveness and reduced blocking.". Lập trình bất đồng bộ với async/await cho phép luồng không phải đứng chờ các thao tác I/O như gọi mạng, đọc tệp hay truy vấn cơ sở dữ liệu: ứng dụng giao diện vẫn phản hồi thao tác người dùng, máy chủ ASP.NET Core trả luồng về thread pool để phục vụ request khác nên chịu tải tốt hơn. "Increased CPU usage." sai vì async không nhằm làm CPU bận hơn, nó còn tốn thêm chút chi phí cho máy trạng thái, lợi ích nằm ở chỗ không lãng phí luồng chờ. "Simplified debugging." sai vì ngược lại, ngăn xếp gọi bị chia qua nhiều phần tiếp nối, deadlock và async void khiến gỡ lỗi khó hơn. "Reduced memory consumption." sai vì mỗi phương thức async còn cấp phát máy trạng thái và Task, tiết kiệm bộ nhớ chỉ là gián tiếp nhờ cần ít luồng hơn, không phải lợi ích chính.
Mở trang câu hỏi này →
19Consider this C# code:4 lựa chọncó codeDễ100% trả lời đúng
Đề bài
public IActionResult Index()
{
    ViewBag.Count = 10;
    return View();
}

Razor:

Đề bài
<p>@(ViewBag.Count + 5)</p>

What happens?

A15
B105
CError
DNothing
Lời giải
Đáp án đúng: "15". ViewBag là đối tượng dynamic bọc quanh ViewData. Action Index gán ViewBag.Count = 10, tức lưu một giá trị int, rồi trả về View. Khi render, biểu thức tường minh @(ViewBag.Count + 5) được tính lúc chạy: dynamic thấy int 10 cộng int 5 nên ra 15, và thẻ p hiển thị số 15. "105" sai vì kết quả nối chuỗi chỉ xảy ra khi Count là chuỗi 10 để phép cộng thành ghép chuỗi, ở đây Count là số nguyên. "Error" sai vì dynamic giải quyết phép cộng lúc chạy, Count tồn tại và có kiểu int nên không có RuntimeBinderException, cũng không có lỗi biên dịch. "Nothing" sai vì ViewBag.Count được truyền sang view qua cùng ViewData trong request nên có giá trị để in, chỉ khi khoá không tồn tại thì null cộng 5 mới cho null và Razor in ra chuỗi rỗng.
Mở trang câu hỏi này →
20What 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
Đáp án đúng: "To build long-running background tasks or services.". Worker Service (mẫu dotnet new worker) dựng trên Generic Host và chạy các lớp kế thừa BackgroundService hoặc cài IHostedService trong vòng lặp dài: xử lý hàng đợi, đồng bộ dữ liệu định kỳ, giám sát hệ thống, có thể triển khai thành Windows Service hoặc daemon systemd, không có giao diện người dùng. "To build web applications." sai vì ứng dụng web dùng ASP.NET Core với MVC, Razor Pages, Web API hoặc Blazor. "To build desktop applications." sai vì ứng dụng máy tính để bàn dùng WPF, WinForms hoặc .NET MAUI. "To build mobile applications." sai vì ứng dụng di động dùng .NET MAUI (trước đây là Xamarin), worker service không có giao diện để chạy trên điện thoại.
Mở trang câu hỏi này →