Đáp án đúng: B. TempData dùng để giữ dữ liệu qua ĐÚNG một lần chuyển hướng, và nơi lưu phụ thuộc vào provider được cấu hình: mặc định trong ASP.NET Core là CookieTempDataProvider - lưu vào cookie đã mã hoá; nếu đăng ký SessionStateTempDataProvider thì dữ liệu nằm trong session state. Vì vậy phát biểu đúng là lưu trong session hoặc cookie tuỳ cấu hình. Phương án A sai vì dữ liệu không chỉ nằm trong bộ nhớ tiến trình; phương án C và D sai vì TempData không ghi xuống cơ sở dữ liệu hay hệ thống tệp.
Tất cả câu hỏi
Ngân hàng câu hỏi trắc nghiệm có đáp án và giải thích chi tiết.
Đáp án đúng: B. Trong Blazor Server, toàn bộ mã C# và cây component chạy TRÊN MÁY CHỦ. Trình duyệt chỉ giữ một kết nối SignalR thường trực, gửi sự kiện người dùng lên máy chủ và nhận về phần chênh lệch của DOM để cập nhật giao diện. Nhờ vậy tải tải về ban đầu rất nhẹ và mã nguồn không lộ ra máy khách, nhưng ứng dụng phụ thuộc vào độ trễ mạng và không chạy được khi mất kết nối. Chạy trong trình duyệt bằng WebAssembly (A) là mô hình của Blazor WebAssembly; C và D mô tả những môi trường không liên quan.
Đáp án đúng: B. 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 (A) là không an toàn vì người dùng có thể bỏ qua; trigger cơ sở dữ liệu (C) quá muộn và sai tầng; thuộc tính HTML tĩnh (D) chỉ là lớp hỗ trợ, không thay được kiểm tra phía máy chủ.
Đáp án đúng: B. Để 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 (A) và dùng tệp HTML tĩnh (C) không liên quan tới truy cập dữ liệu; còn phương án D 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.
Đáp án đúng: C. 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 (A) chỉ đăng ký dịch vụ và cấu hình pipeline; Startup.cs (D) 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 (B), nhưng trong phạm vi Blazor Server/WebAssembly của môn học thì App.razor là câu trả lời.
Đáp án đúng: A. 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 B sai vì Worker Service không có giao diện; phương án C 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 D sai vì đây là ứng dụng .NET đa nền tảng, chạy được cả trên Linux và trong container.
Đáp án đúng: B. 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() (A), SubmitForm() (C) và Post() (D) 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.
Đáp án đúng: A. 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 B, C, D 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.
Đáp án đúng: B. 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 (A) là việc của entity và DbContext; quản lý phiên (C) là của Session; bố cục giao diện (D) do _Layout.cshtml đảm nhiệm.
Đáp án đúng: C. 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 (A, B) lấy qua thuộc tính Client.RemoteEndPoint chứ không phải GetStream. Đóng kết nối (D) là việc của Close() hoặc Dispose(), thường được gọi trong khối using.
Đáp án đúng: D. 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.
Đáp án đúng: B. 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 (A) 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 (C) và FTP (D) 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.
Đáp án đúng: C. 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 (B) 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 (A) chỉ tạo một thể hiện duy nhất dùng suốt vòng đời ứng dụng. "Isolated" (D) không phải một vòng đời trong hệ thống DI tích hợp sẵn của .NET.
Đáp án đúng: B. 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 A sai - muốn giữ dữ liệu qua nhiều request phải dùng TempData hoặc Session. Quản lý phiên (C) là việc của Session; còn mã hoá dữ liệu (D) không liên quan gì tới hai cơ chế này.
Đáp án đúng: D. 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 hoàn toàn hợp lệ trong C#, nên phương án C bị loại; và framework không tự ưu tiên bản đồng bộ hay bất đồng bộ, nên A và B đều sai.
Đáp án đúng: A. Đị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 B 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 C mô tả phần cứng vật lý là dây cáp; phương án D 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.
Đáp án đúng: A. flutter_test là gói kiểm thử chính thức đi kèm SDK, cung cấp testWidgets, WidgetTester, các matcher như findsOneWidget và các tiện ích bơm khung hình để kiểm thử unit lẫn widget; nó được khai báo trong dev_dependencies của pubspec.yaml. Provider (B) là giải pháp quản lý trạng thái, http (C) dùng để gọi API và sqflite (D) là cơ sở dữ liệu cục bộ - cả ba đều là gói chức năng của ứng dụng chứ không phải hạ tầng kiểm thử. Riêng kiểm thử tích hợp dùng thêm gói integration_test.
Đáp án đúng: B. Scaffold là widget dựng khung cho một màn hình theo Material Design: nó cung cấp sẵn các khe cho appBar, body, floatingActionButton, drawer, bottomNavigationBar và snackBar, đồng thời xử lý đúng vùng an toàn cùng bàn phím. Container (A) chỉ là hộp trang trí và định kích thước cho một widget con; Column (C) sắp xếp các widget theo chiều dọc; ListView (D) hiển thị danh sách cuộn được. Cả ba đều thường nằm BÊN TRONG body của Scaffold chứ không thay thế được vai trò khung màn hình của nó.
Đáp án đúng: C. Để chạy và kiểm thử ứng dụng Flutter trên máy cá nhân, bạn cần một đích chạy thực sự: máy ảo Android, trình giả lập iOS hoặc một thiết bị vật lý kết nối qua USB - flutter devices sẽ liệt kê chúng. Dịch vụ lưu trữ đám mây (A) và máy chủ vật lý (B) là hạ tầng phía sau, không cần cho việc chạy ứng dụng di động cục bộ; hệ quản trị cơ sở dữ liệu (D) chỉ cần khi ứng dụng thực sự dùng tới, không phải điều kiện để khởi chạy.
Đáp án đúng: C. Kim tự tháp kiểm thử có đáy rộng là unit test - nhiều nhất vì nhanh, rẻ và dễ khoanh vùng lỗi; ở giữa là widget test (tương đương integration/component test trong các nền tảng khác); trên đỉnh là integration test chạy toàn ứng dụng trên thiết bị hoặc trình giả lập. Vì integration test chậm, đắt và dễ gãy nhất nên phải dùng ÍT nhất, chỉ cho các luồng nghiệp vụ then chốt. "Debug Tests" (D) không phải một loại kiểm thử trong kim tự tháp này.